每次我尝试让用户生成密码时,无论我键入的密码是我设置的标准还是密码,该密码都会始终为假。
我尝试重写检查方法几次,但是都没有运气。我尝试使用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个数字,一个大写字母,一个小写字母和一个特殊字符
答案 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;
}