获取StringIndexOutOfBound异常

时间:2018-06-21 18:38:09

标签: java indexoutofboundsexception stringindexoutofbounds

我正在编写程序,使用以下条件接受用户名和密码-用户名必须至少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 个答案:

答案 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。该字符串中字符的有效索引是013。用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