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

时间:2019-04-01 05:27:08

标签: java

每次我尝试让用户生成密码时,无论我键入的密码是我设置的标准还是密码,该密码都会始终为假。

我尝试重写检查方法几次,但是都没有运气。我尝试使用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个数字,一个大写字母,一个小写字母和一个特殊字符

5 个答案:

答案 0 :(得分: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)

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

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

答案 1 :(得分:0)

您的代码有两个问题

1)while条件。 要符合您的条件,应该是

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

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

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

下面是完整的代码段

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

答案 2 :(得分:0)

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

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

关于while循环,删除除

以外的所有内容
i < password.length()

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

答案 3 :(得分: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;
    }

答案 4 :(得分: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;
    }