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

标签 java string boolean indexoutofboundsexception chars

我为类(class)编写了一个程序,具有以下要求:

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

如果不满足其中任何一个条件,则输出必须指出错误。如果满足所有条件,则输出“密码成功更改”或类似内容。当我发现我无法在程序中使用 for 循环时,问题就出现了,因为我们只能使用到目前为止所学到的知识来发挥我们的聪明才智和解决问题。还特别指出我们不能使用数组。 我从头开始我的程序,一切正常,直到我故意输入四个字符来输出“必须有五个字符”。我得到了字符串索引越界异常错误,表明我的 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.");
    }
  }
}

最佳答案

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

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.");

}

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

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

关于java - 密码程序的字符串索引越界异常错误 - 不允许使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597830/

相关文章:

java - JDBC 的难倒 SQL 异常

javascript - 我如何在 JSP 中使用 JavaScript 的 session 存储?

javascript - 如何使用 Javascript 将字符串中的子字符串剪切到末尾?

javascript - jQuery 字符串包含操作?

c - 如何去掉字符串开头的 '\n'

javascript - 使用 lodash 或 angularjs 测试对象中是否存在值的最简单方法是什么

c++ - 字符串文字匹配 bool 重载而不是 std::string

java - 获取 Windows 注销时间?

ios - 调用 BOOL 方法并处理结果

java - 使用 javafx SimpleMapProperty 时出现 UnsupportedOperationException