获取 StringIndexOutOfBound 异常

getting StringIndexOutOfBound Exception

我正在编写一个程序来使用以下条件接受用户名和密码 - 用户名必须至少为 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;
                            }
                        }
                    }
                }
            }
        }
    }
}

忽略此实现的低效之处,以下行:

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() 即将 return 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;
}

如果所有条件都通过,这将 return true,否则 false