我一直在尝试使用 java 创建密码验证。密码验证的要求应为:
1) 密码长度应至少为六个字符。
2)密码至少包含一个大写和小写字母。
3) 密码应至少为一位数字。
我已经完成了 1 和 2,但我无法找出数字 3。
我制作了一个 boolean 方法来检查字符是否包含数字。据说,如果它能够找到一个数字,它会返回 true,但即使我输入了带有数字的密码,它仍然返回 false。
我想知道我的代码出了什么问题。希望你们能帮我解决这个问题。
package PasswordVerifier;
import java.util.Scanner;
public class PasswordVerifierMain {
public static void main(String[]args){
Scanner hold = new Scanner(System.in);
String pass;
System.out.print("Enter password:");
pass = hold.nextLine();
if(isValid(pass) && pass.length() >= 6){
boolean hasUppercase = pass.equals(pass.toUpperCase());
boolean hasLowercase = pass.equals(pass.toLowerCase());
if(!hasUppercase){
System.out.print("Must have atleast one uppercase letter!");
}else if(!hasLowercase){
System.out.print("Must have atleast one lowercase letter!");
}else{
System.out.print("Password Successful!");
}
}else{
System.out.print("Invalid Password! Minimum six characters!");
}
System.out.println();
System.out.println(isValid(pass));
}
private static boolean isValid(String pass){
boolean status = true;
int i = 0;
while(status && i < pass.length()){
if(!Character.isDigit(pass.charAt(i))){
status = false;
}
i++;
}
return status;
}
}
最佳答案
您可以在每次迭代中设置状态,从而有效地覆盖除最后一个字符之外的任何真实值。除此之外,您应该假设 status = false
并在找到数字时将其设置为 true。您的代码认为任何包含其他字符的密码都是无效的。
示例:
pass = "1abcde"
status = true
1st iteration: char = 1 -> a digit, so status is not changed
2nd iteration: char = a -> not a digit, so status will be set to false
loop will break since status is false -> result: not valid
要解决此问题,首先假设 status = false
并且当您找到数字集时 status = true
。这样,当密码包含数字时,它将被视为有效。
示例:
status = false; //assume invalid password
for( char c : pass.toCharArray() ) {
if( Character.isDigit( c ) ) {
//found a digit
status = true;
//we're done since we found at least one digit
break;
}
}
return status;
不过,您的方法还可以改进:
迭代字符并收集它们的特征(例如大写、小写、数字、特殊字符等)。然后检查特征的数量以及是否存在所需的特征。
示例:
enum CharTraits {
LOWER_CASE,
UPPER_CASE,
DIGIT,
SPECIAL
}
Set<CharTraits> getPasswordTraits( String pw ) {
Set<CharTraits> traits = new HashSet<>();
for( char c : pw.toCharArray() ) {
//better check for index of 0-9 otherwise you allow non-ascii digits as well
if( Character.isDigit( c ) ) {
traits.add( DIGIT );
}
else if ( Character.isUpperCase( c ) {
traits.add( UPPER_CASE);
}
... //the rest
}
return traits;
}
boolean isValid(String pass){
Set<CharTraits> traits = getPasswordTraits( String pass )
//Check for digits (just an example, you could check for more)
return traits.contains( DIGIT );
//if you want to check for 3 out of 4 just do this:
//return traits.size() >= 3;
}
关于java - java中调试密码验证代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330964/