密码程序的字符串索引越界异常错误 - 不允许数组

String Index Out of Bounds Exception Error for password program - NO arrays allowed

我为 class 编写了一个程序,要求如下:

提示用户输入新密码。 长度必须为五个字符。 必须有一个大写字母。 必须有一个小写字母。 必须有一个数字。

如果不满足这些条件中的任何一个,则输出必须说明错误。如果满足所有条件,输出 "password successfully changed," 或类似的东西。当我发现我不能在我的程序中使用 for 循环时,问题就出现了,因为我们只应该使用我们到目前为止所学的知识来发挥我们的创造力和解决问题。还特别说明了我们不能使用数组。 我从头开始我的程序,一切正常,直到我故意输入四个字符输出 "must have five characters." 我得到了字符串索引越界异常错误,表明我的 charAt(4) 是罪魁祸首。据我了解,如果我输入 4 个字符,程序会认为第五个字符不存在。为什么即使我在字符列表下方说明了长度条件,它仍会显示此错误? 伪代码就足够了,因为我更喜欢从指导中学习而不是复制代码。它必须是我正在查看的小东西,因为除了键入太少的字符外,一切正常。它显示相同的错误,只是根据丢失的字符数更改索引。
这是程序:

import java.util.Scanner;

public class ChangePassword1 {
  public static void main(String[]args) {

    Scanner input = new Scanner(System.in);

    boolean hasUpper = false;
    boolean hasLower = false;
    boolean hasDigit = false;
    boolean passLength = false;

    System.out.print("Please enter your new password: ");
    String newpassword = input.nextLine();

    char c1 = newpassword.charAt(0);
    char c2 = newpassword.charAt(1);
    char c3 = newpassword.charAt(2);
    char c4 = newpassword.charAt(3);
    char c5 = newpassword.charAt(4);

    if (newpassword.length() < 5 || newpassword.length() > 5) {
      System.out.println("Your password must be five characters in length.");

    }

    if (!Character.isUpperCase(c1) && !Character.isUpperCase(c2) && !Character.isUpperCase(c3) && !Character.isUpperCase(c4) && !Character.isUpperCase(c5)) { 
      System.out.println("Your password must contain at least one uppercase letter.");

      if (!Character.isLowerCase(c1) && !Character.isLowerCase(c2) && !Character.isLowerCase(c3) && !Character.isLowerCase(c4) && !Character.isLowerCase(c5)) 
        System.out.println("Your password must contain at least one lowercase letter.");

      if (!Character.isDigit(c1) && !Character.isDigit(c2) && !Character.isDigit(c3) && !Character.isDigit(c4) && !Character.isDigit(c5)) 
        System.out.println("Your password must contain at least one digit.");
    }


    if (newpassword.length() == 5) {
      passLength = true;

      if (Character.isUpperCase(c1) || Character.isUpperCase(c2) || Character.isUpperCase(c3) || Character.isUpperCase(c4) || Character.isUpperCase(c5))
        hasUpper = true;
      if (Character.isLowerCase(c1) || Character.isLowerCase(c2) || Character.isLowerCase(c3) || Character.isLowerCase(c4) || Character.isLowerCase(c5))
        hasLower = true;
      if (Character.isDigit(c1) || Character.isDigit(c2) || Character.isDigit(c3) || Character.isDigit(c4) || Character.isDigit(c5))
        hasDigit = true;
      if (passLength == true && hasUpper == true && hasLower == true && hasDigit == true) 
        System.out.println("Password successfully changed.");
    }
  }
}

如果您查看此块,您可能会看到错误:

char c1 = newpassword.charAt(0);
char c2 = newpassword.charAt(1);
char c3 = newpassword.charAt(2);
char c4 = newpassword.charAt(3);
char c5 = newpassword.charAt(4);

if (newpassword.length() < 5 || newpassword.length() > 5) {
    System.out.println("Your password must be five characters in length.");

}

你测试一下你有一个包含 5 个字符的字符串 在你尝试 并使用 charAt(4) 访问第 5 个字符之后。尝试在 charAt 调用之前移动测试:这将阻止您为不存在的字符串索引调用 charAt

此外,您的测试可以更简单。如果它必须是 5 个字符,为什么不直接测试 newPassword.length() 是否等于 (==) 正确的长度?

经过许多错误和陷阱后,这是越界异常消失的唯一方法,return;陈述。

    System.out.print("Please enter your new password: ");
    String newpassword = input.nextLine();

    if (newpassword.length() != 5) { 
       System.out.println("Your password must be five characters in length.");
      return;
    }