编辑:这可能是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.");
}
}
}
答案 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;
}
在你的情况下,性能提升可能是微不足道的,但是当你处理超过三个条件和一个长度远大于六的字符串(或其他)时,请记住这一点。