Получение исключения 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 иначе.

Другие вопросы по тегам