Получение исключения StringIndexOutOfBound
Я пишу программу для принятия имени пользователя и пароля, используя следующие условия - имя пользователя должно быть не менее 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;
}
}
}
}
}
}
}
}
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
иначе.