我正在编写程序,使用以下条件接受用户名和密码-用户名必须至少8个字符。密码必须至少包含10个字符,密码中必须包含1个小写字母,1个大写字母和1位数字。 我按照所有条件编写了一个方法setPassword()。当我尝试执行时,出现StringIndexOutOfBound异常。我不明白为什么会收到该错误:
public void setPassword(String password)
{
char ch;
if (password.length() <= 10) {
for (int i = 0; i <= password.length() - 1; i++) {
ch = password.charAt(i);
if (Character.isDigit(ch)) {
for (int j = 0; j <= password.length() - 1; j++) {
char ch1 = password.charAt(j);
if (Character.isUpperCase(ch1)) {
for(int k = 0; k <= password.length(); k++) {
char ch2 = password.charAt(k);
if (Character.isLowerCase(ch2)) {
this.password = password;
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
忽略此实现的低效率,以下行:
for(int k = 0; k <= password.length(); k++) {
应该是:
for(int k = 0; k < password.length(); k++) {
// ^ removed the = from here
或者:
for(int k = 0; k <= password.length() - 1; k++) {
// ^ subtract 1 here
对于以下字符串:
String s = "this-is-a-test";
s.length()
将返回14
。该字符串中字符的有效索引是0
至13
。用for
循环遍历数组的惯用方式是:
for (int i = 0; i < length_of_array; i++)
您选择改用i <= length_of_array - 1
实际上是一样的东西(虽然更冗长),但最后一个for
循环中您忽略了从长度中减去1
这是根据您提供的条件检查密码有效性的简单方法:
public static boolean isPasswordValid(String password)
{
if (password.length() < 10) {
return false;
}
int lc = 0, uc = 0, digit = 0;
for (int i = 0; i < password.length(); i++) {
char c = password.charAt(i);
if (Character.isLowerCase(c)) {
lc++;
} else if (Character.isUpperCase(c)) {
uc++;
} else if (Character.isDigit(c)) {
digit++;
}
}
return lc > 0 && uc > 0 && digit > 0;
}
如果所有条件均通过,它将返回true
,否则返回false
。