2

每次我尝试让用户生成密码时,它总是会返回为假,无论我是否按照我设置的标准输入密码。

我曾多次尝试重写检查方法,但没有运气。我尝试使用 ArrayList 来比较。

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();
}

如果小于 6 个字符且大于 16 个字符,我希望密码返回 false。此外,密码必须包含 1 个数字、一个大写字母、一个小写字母和一个特殊字符

4

5 回答 5

0

您的 while 语句是错误的:

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

当其中一个标志变为 true 时,while 循环将退出,因为它将变为 false(! 符号)并且表达式将评估为 false。

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

表达方式 :

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

转为:

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

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

考虑修改您的 while 语句以匹配您正在寻找的标准。

于 2019-04-01T05:33:50.023 回答
0

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

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

关于while循环,删除除

i < password.length()

您总是想迭代密码中的所有字符。

于 2019-04-01T05:42:45.390 回答
0

你永远不会用那个while循环完成所有字符的循环,你也不需要太使用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;
    }
于 2019-04-01T05:45:51.457 回答
0

您的代码有两个问题

1)while条件。为了满足您的标准,它应该是

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

这将确保即使单个boolean(hasDigit/hasLower/hasUpper)值为 false,循环也会持续到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();
}
}
于 2019-04-01T05:40:01.990 回答
0
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;
    }
于 2019-04-01T06:14:54.293 回答