5 回答
TA贡献1963条经验 获得超6个赞
您的 while 语句是错误的:
while(i < password.length() && !hasDigit && !hasLower && !hasUpper)
当其中一个标志变为 true 时,while 循环将退出,因为它将变为 false(! 符号),表达式的计算结果将为 false。
为了进一步解释,假设密码的第一个字符是一个数字。然后,具有数字的旗帜将变为真。所有其他标志都是假的。
表达式:
while(i < password.length() && !hasDigit && !hasLower && !hasUpper)
转至 :
while(i < password.length() && false && true && true)
整个表达式的计算结果为 false。
考虑修改您的 while 语句以符合您要查找的条件。
TA贡献1840条经验 获得超5个赞
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;
}
TA贡献1789条经验 获得超10个赞
您的代码有两个问题
1)同时条件。要满足您的标准,它应该是
while(i < password.length() && !(hasDigit && hasLower && hasUpper))
这将确保即使单个值为 false,循环也会一直持续到字符串长度的末尾boolean(hasDigit/hasLower/hasUpper)password
2) 在模式初始化中定义的特殊字符字符串。它应该是这样的:[#$&!]
以下是完整的代码片段
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();
}
}
TA贡献1799条经验 获得超6个赞
你永远不会用它完成所有字符的循环,同时循环,你也不需要太使用一个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;
}
TA贡献1797条经验 获得超4个赞
首先,第一个如果永远不会是真的。长度不能短于 6 且长于 16。将其更改为或
if(password.length() < 6 || password.length() > 16)
关于 while 循环,删除除
i < password.length()
您始终希望迭代密码中的所有字符。
添加回答
举报