2012-10-23 168 views
-4

我有以下问题:我想从用户的字符串阅读,到目前为止,它工作得很好,但每次我按下只是“回归”我知道送花儿给人以下错误:Java命令行控制台并切换

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

感谢您的帮助。

+1

另请注意,'tokens [0] .toLowerCase()'实际上并不做任何事情。字符串在Java中是不变的,所以你不能修改它们。您需要存储该方法的结果,例如'tokens [0] = token [0] .toLowerCase()'。 –

回答

2

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

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

tokens[0].toLowerCase(); 

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

+0

谢谢,我没有考虑到这一点。现在工作。 – siebenschlaefer

0

看看您的tokens阵列在分割后是否填充了任何字符串,因为我认为这是创建问题。

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

这里是按“返回”的问题

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

这里不给你空和你的,如果条件失败。

代码在低于线

tokens[0].toLowerCase(); 
0

失败显然用户输入是空字符串。在分割之前先进行空字符串检查。

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