密码验证者问题

时间:2013-07-02 22:35:05

标签: java

编辑:这可能是PasswordVerifier.Java中的非常糟糕的代码

我正在做一个密码验证程序,用于检查输入的密码是否至少为6个字符,是否包含大写字母,小写字母和数字。

我认为我的后勤工作有点正确,但出于某种原因,我的程序不会进入下一个提示。它询问我的密码,然后挂机,并没有告诉我我的密码是否有效。我认为我的for循环是正确的,所以我不知道我的问题是什么。

PasswordVerifier.Java

import java.util.*;

public class PasswordVerifier{

    //field
    private static int MIN_PASSWORD_LENGTH = 6;

    //methods
    public static boolean isValid(String str){

        boolean valid = false;

        PasswordVerifier pass = new PasswordVerifier();

        if(pass.hasUpperCase(str)|| pass.hasLowerCase(str) || pass.hasDigit(str)){
            valid = true;
        }

        if (str.length() < 6){
            valid = false;
        }

        return valid;

    }

    //UpperCase Boolean check
    private boolean hasUpperCase(String str){

        boolean valid = false;

        int i = 0;

        while (i < str.length()){
            if (Character.isUpperCase(str.charAt(i)))
            valid = true;
        }   
        i++;

        return valid;
    }

    //Lowercase Boolean Check
    private boolean hasLowerCase(String str){

        boolean valid = false;

        int i = 0;

        while (i < str.length()){
            if (Character.isLowerCase(str.charAt(i)))
            valid = true;
        }   
        i++;

        return valid;
    }

    //Number boolean check
    private boolean hasDigit(String str){

        boolean valid = false;

        int i = 0;

        while (i < str.length()){
            if ((Character.isDigit(str.charAt(i))))
            valid = true;
        }   
        i++;

        return valid;

    }   

}

PasswordDemo.Java

import javax.swing.JOptionPane;

public class PasswordDemo{

    public static void main(String[] args){

        String input; //To hold the user's input

        input = JOptionPane.showInputDialog("Enter a Password");

            if (PasswordVerifier.isValid(input)){
                JOptionPane.showMessageDialog(null, "Valid Password");
            }
            else{
                JOptionPane.showMessageDialog(null, "invalid Password, try again.");
            }           

    }
}

3 个答案:

答案 0 :(得分:5)

您的while循环永远不会递增i,因为您将i++放在循环的末尾。结果是一个无限循环和你描述的“悬挂”。

E.g。取代

while (i < str.length()){
    if (Character.isUpperCase(str.charAt(i)))
    {
        valid = true;
        // Added break because we found an uppercase letter already.
        break;
    }
    i++;  // Inside the while loop.
}

您需要对每个while循环进行类似的更改。

此外,如果要强制执行所有3条规定,请不要使用逻辑或运算符||,请使用逻辑 - 和&&

if (pass.hasUpperCase(str) && pass.hasLowerCase(str) && pass.hasDigit(str)) {
    valid = true;
}

这将确保密码具有大写字母它具有小写字母它具有数字。

答案 1 :(得分:0)

我认为你的问题是你在while循环之外计算i ++。 把它放在这样的时间:

private boolean hasUpperCase(String str){

    boolean valid = false;

    int i = 0;

    while (i < str.length()){
        if (Character.isUpperCase(str.charAt(i)))
        valid = true;
        i++;
    }   

    return valid;
}

这是你得到的每一个循环中的问题。

答案 2 :(得分:0)

现在你要通过密码进行三次传递以验证三个字符条件 - 你可以将其压缩为一次传递。此外,您最后检查密码的长度 - 您应该先检查密码,因为这是验证的最快条件。

public static boolean isValid(String str) {
    if(str.length() < 6) return false;
    int i = 0;
    boolean hasDigit = false;
    boolean hasLower = false;
    boolean hasUpper = false;
    while(i < str.length() && !hasDigit && !hasLower && !hasUpper) {
        if(Character.isDigit(str.charAt(i))) {
            hasDigit = true;
        } else if(Character.isLowerCase(str.charAt(i))) {
            hasLower = true;
        } else if(Character.isUpperCase(str.charAt(i))) {
            hasUpper = true;
        }
        i++;
    }
    return hasDigit && hasUpper && hasLower;
}

在你的情况下,性能提升可能是微不足道的,但是当你处理超过三个条件和一个长度远大于六的字符串(或其他)时,请记住这一点。