Java命令行控制台和开关

时间:2012-10-23 09:14:56

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

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

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;
        }
    }
}

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

如果在访问第0个元素时获得索引超出范围异常,则string可能为空。你需要为此添加一个检查,检查null是不够的。

顺便说一下,当你这样写:

tokens[0].toLowerCase();

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您按下了返回更改代码,则输入字符串为空,如下所示进行修复。

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

答案 3 :(得分:0)

这是问题

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

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

代码在以下行失败

tokens[0].toLowerCase();

答案 4 :(得分:0)

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

if (input == null && input.isEmpty()) {
    break;
}
相关问题