2017-03-03 198 views
0

我寫一個程序,它根據「changes.txt」,並輸出到另一個文件需要輸入從文件「items.txt」和添加或刪除行。爪哇的StringIndexOutOfBoundsException

這是 「items.txt」 文件:

101,Nail #1 
102,Nail #2 
103,Nail #3 
104,Hammer Small 
105,Hammer Large 

這是更改文件:

A,106,Chainsaw 12" 
D,102 
d,104 
a,107,Chainsaw 10" 

這是我的方法,該方法具有的問題(void changes()是行號132):

void changes() { 
    try { 
     fileChange = new Scanner(new File("changes.txt")); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    fileChange.useDelimiter(",|\r|\n"); 


    while (fileChange.hasNext()) { 
     String codeStr = fileChange.next(); 
     if ((codeStr.charAt(0) == 'D') || (codeStr.charAt(0) == 'd')) { 
      delete(fileChange.nextInt()); 
      System.out.println("delete"); 
     } else if ((codeStr.charAt(0) == 'A') || (codeStr.charAt(0) == 'a')) { 
      add(fileChange.nextInt(), fileChange.next()); 
      System.out.println("add"); 
     } //else 
      System.out.println("done"); 
    } 

    fileChange.close(); 
} 

這是輸出我得到:

add 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
done 

我在打印語句增加了「添加」和「完成」只是爲了幫助在早期診斷問題。即使它打印「添加」和「完成」,也不會將任何內容發送到輸出文件。我猜這是由於StringIndexOutOfBoundsException

這是我的第一個關於堆棧溢出的問題,所以請耐心等待任何格式問題或不當禮節。

+0

使用調試器,單步執行代碼。看看它在崩潰時使用的值。 – Robert

+0

稍後的一些迭代可能會引發異常。 (Sry,我現在喝醉了。)哪一行會拋出異常? –

+0

您可能會嘗試檢查空輸入的第一個字母(根本沒有字母)。 – Robert

回答

0

您應該檢查codeStr.isEmpty()你做一個charAt(0)之前。

您正在訪問空字符串。

喜歡的東西

while (fileChange.hasNext()) { 
    String codeStr = fileChange.next(); 
    if (codeStr.isEmpty()) continue; 
1

這樣做的原因是,你正在使用",|\r|\n"作爲分隔符。 這將返回您的換行符的\r\n之間的空令牌(假定您使用的是Windows風格的換行符)。例如:

Scanner sc = new Scanner(new StringReader("Hello\r\nWorld")); 
sc.useDelimiter(",|\r|\n"); 
while (sc.hasNext()) { 
    String n = sc.next(); 
    System.out.println(n.length() + " " + n); 
} 

輸出:

5 Hello 
0 
5 World 

Ideone demo

因此,對於那些零長度標記,你可以不讀charAt(0),因爲沒有這樣的字符。

將您的分隔符更改爲",|\r\n"之類的內容,即將\r\n作爲單個分隔符處理。

+0

我將分隔符更改爲「,\ r \ n」,現在它將添加標記爲「A」和「a」的更改,但不會刪除標記爲「D」和「d」的更改。 – Henry

+0

在這種情況下,您可能會出現混合換行符。試試'「,| \ r?\ n」'。 [如果所有換行符都是'\ r \ n'](http://ideone.com/XwLAJ8),對我來說似乎很好。 –