为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复我的代码,以便它找到我设置的密码

如何修复我的代码,以便它找到我设置的密码

犯罪嫌疑人X 2022-09-14 15:24:45
每次我尝试让用户生成密码时,它总是会返回为假的,无论我是否按照我设置的标准输入它。我曾多次尝试重写检查方法,但没有运气。我尝试使用数组列表来比较。public boolean check(String password) {    if(password.length() < 6 && password.length() > 16)     {        return false;    }    Pattern special = Pattern.compile (specialChars);    Matcher hasSpecial = special.matcher(password);    int i = 0;    boolean hasDigit = false;    boolean hasLower = false;    boolean hasUpper = false;    while(i < password.length() && !hasDigit && !hasLower && !hasUpper)     {        if(Character.isDigit(password.charAt(i)))         {            hasDigit = true;        }         else if(Character.isLowerCase(password.charAt(i)))         {            hasLower = true;        }         else if(Character.isUpperCase(password.charAt(i)))         {            hasUpper = true;        }        i++;    }    return hasDigit && hasUpper && hasLower && hasSpecial.find();}我希望密码返回 false,如果它小于 6 个字符且超过 16 个字符。此外,密码必须包含1个数字,一个大写字母,一个小写字母和一个特殊字符
查看完整描述

5 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

您的 while 语句是错误的:

while(i < password.length() && !hasDigit && !hasLower && !hasUpper)

当其中一个标志变为 true 时,while 循环将退出,因为它将变为 false(! 符号),表达式的计算结果将为 false。

为了进一步解释,假设密码的第一个字符是一个数字。然后,具有数字的旗帜将变为真。所有其他标志都是假的。

表达式:

while(i < password.length() && !hasDigit && !hasLower && !hasUpper)

转至 :

while(i < password.length() && false && true && true)

整个表达式的计算结果为 false。

考虑修改您的 while 语句以符合您要查找的条件。


查看完整回答
反对 回复 2022-09-14
?
慕斯709654

TA贡献1840条经验 获得超5个赞

public boolean check(String password) {


        boolean hasDigit, hasLower, hasUpper, hasSpecial;

        hasDigit = hasLower = hasUpper = hasSpecial = false;


        if (password.length() >= 6 && password.length() <= 16) {

            int i = 0;

            while (i < password.length()) {

                if(Character.isDigit(password.charAt(i))) {

                    hasDigit=true;

                }

                else if(Character.isLowerCase(password.charAt(i))) {

                    hasLower=true;

                }

                else if(Character.isUpperCase(password.charAt(i))) {

                    hasUpper=true;

                }

                else if(!Character.isLetterOrDigit(password.charAt(i))) {

                    hasSpecial=true;

                }


                if (hasDigit && hasLower && hasUpper && hasSpecial) {

                    return true;

                }

                i++;

            }

        }

        return false;

    }


查看完整回答
反对 回复 2022-09-14
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您的代码有两个问题


1)同时条件。要满足您的标准,它应该是


 while(i < password.length() && !(hasDigit && hasLower && hasUpper)) 

这将确保即使单个值为 false,循环也会一直持续到字符串长度的末尾boolean(hasDigit/hasLower/hasUpper)password


2) 在模式初始化中定义的特殊字符字符串。它应该是这样的:[#$&!]


以下是完整的代码片段


public class Snippet {

public static void main(String[] args ) {

    Snippet snippet = new Snippet();

    System.out.println(snippet.check("Abcd#fg1d#"));

}


public boolean check(String password) 

{

    if(password.length() < 6 && password.length() > 16) 

    {

        return false;

    }


    Pattern special = Pattern.compile ("[#!]");

    Matcher hasSpecial = special.matcher(password);

    int i = 0;

    boolean hasDigit = false;

    boolean hasLower = false;

    boolean hasUpper = false;

    while(i < password.length() && (!hasDigit || !hasLower || !hasUpper)) 

    {

        if(Character.isDigit(password.charAt(i))) 

        {

            hasDigit = true;

        } 

        else if(Character.isLowerCase(password.charAt(i))) 

        {

            hasLower = true;

        } 

        else if(Character.isUpperCase(password.charAt(i))) 

        {

            hasUpper = true;

        }

        i++;

    }


    return hasDigit && hasUpper && hasLower && hasSpecial.find();

}

}


查看完整回答
反对 回复 2022-09-14
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

你永远不会用它完成所有字符的循环,同时循环,你也不需要太使用一个while循环


    public boolean check(String password) {

        if (password.length() < 6 && password.length() > 16) {

            return false;

        }

        boolean hasSpecial = password.matches(specialChars);

        boolean hasDigit = password.matches(".*\\d+.*");

        boolean hasLower = !password.equals(password.toUpperCase());

        boolean hasUpper = !password.equals(password.toLowerCase());

        return hasDigit && hasUpper && hasLower && hasSpecial;

    }


查看完整回答
反对 回复 2022-09-14
?
繁星coding

TA贡献1797条经验 获得超4个赞

首先,第一个如果永远不会是真的。长度不能短于 6 且长于 16。将其更改为或

if(password.length() < 6 || password.length() > 16)

关于 while 循环,删除除

i < password.length()

您始终希望迭代密码中的所有字符。


查看完整回答
反对 回复 2022-09-14
  • 5 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信