2017-03-03 10 views
0

"items.txt"ファイルから入力を受け取り、 "changes.txt"に従って行を追加または削除し、別のファイルに出力するプログラムを作成しています。Java StringIndexOutOfBoundsException

これは "items.txt" ファイルです:

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

これは問題を抱えている私の方法である(void changes()は、行番号132である):これは、変更がファイルである

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

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 

以前の問題の診断に役立つように、「追加」と「完了」の印刷文を追加しました。 "add"と "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を1つの区切り文字として扱います。

+0

デリミタを "、| \ r \ n"に変更しましたが、 "A"と "a"の変更が追加されますが、 "D"と "d"の変更は削除されません。 – Henry

+0

この場合、改行が混在している可能性があります。 ''、| \ r?\ n "'を試してください。 [すべての改行が '\ r \ n'であればうまくいくようです。](http://ideone.com/XwLAJ8)。 –

関連する問題