2012-10-23 208 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; 
}