【问题标题】:Java command line console and switchJava命令行控制台和开关
【发布时间】:2012-10-13 04:30:43
【问题描述】:

我有以下问题:我想从用户那里读取一个字符串,到目前为止它工作得很好但是每次我按“返回”我总是得到以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:658)
    at Shell.execute(Shell.java:20)
    at Shell.main(Shell.java:55)

这将是代码:

private static void execute(BufferedReader stdin) throws IOException {
    boolean quit = false;
    Field test = new Field();
    while (!quit) {
        System.out.print("ch> ");
        String input = stdin.readLine();
        if (input == null) {
                break;
        }
        String[] tokens = input.trim().split("\\s+");
        tokens[0].toLowerCase();
        char tmp = tokens[0].charAt(0);
        switch (tmp) {
        case 'n':
                test.setPoints(null);
                break;
        case 'a':
                test.add(new Point(Integer.parseInt(tokens[1]), Integer
                        .parseInt(tokens[2])));
                break;
        case 'r':
                test.remove(new Point(Integer.parseInt(tokens[1]), Integer
                        .parseInt(tokens[2])));
                break;
        case 'p':
                System.out.println(test);
                break;
        case 'c':
                System.out.println(test.convexHull());
                break;
        case 'h':
                System.out.println("");
                break;
        case 'q':
                quit = true;
                break;
        default:
                break;
        }
    }
}

感谢您的帮助。

【问题讨论】:

  • 还要注意tokens[0].toLowerCase()实际上并没有做任何事情。字符串在 Java 中是不变的,因此您无法修改它们。您需要存储该方法的结果,例如tokens[0] = token[0].toLowerCase().

标签: java switch-statement command-line-arguments


【解决方案1】:

如果您在访问第 0 个元素时遇到索引越界异常,则您的字符串可能为空。您需要为此添加一个检查,检查 null 是不够的。

顺便说一句,当你这样写时:

tokens[0].toLowerCase();

我高度怀疑您的令牌[0] 保持不变。由于 java 中的字符串是不可变的,toLowerCase 必须返回一个只包含小写字符的新字符串。

【讨论】:

  • 谢谢,我没有考虑到这一点。现在可以使用了。
【解决方案2】:

查看您的tokens 数组在拆分后是否填充了任何字符串,因为我认为这会造成问题。

【讨论】:

    【解决方案3】:

    如果您按下回车键,您的输入字符串为空,请按如下方式更改您的代码以修复它。

    while (!quit) {
         System.out.print("ch> ");
         String input = stdin.readLine();
         if (input == null && input.length()<1) { //changed line!
              break;
         }
          String[] tokens = input.trim().split("\\s+");
    

    【讨论】:

      【解决方案4】:

      问题来了

      String input = stdin.readLine();
              if (input == null) {
                      break;
              }
      

      这里按“return”不会给你 null 并且你的 if 条件失败。

      代码在下面一行失败

      tokens[0].toLowerCase();
      

      【讨论】:

        【解决方案5】:

        很明显用户输入是空字符串。在拆分之前放置空字符串检查。

        if (input == null && input.isEmpty()) {
            break;
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-04
          相关资源
          最近更新 更多