2017-03-03 2 views
0

"items.txt"파일에서 입력을 받고 "changes.txt"에 따라 행을 추가 또는 제거하고 다른 파일로 출력하는 프로그램을 작성 중입니다. Java 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)에 문제가 내 방법입니다 :

0 :
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

나중에 반복이 예외를 throw 할 수 있습니다. (sry, 나는 지금 술에 취해있다.) 어떤 줄이 예외를 던집니까? –

+0

아마도 빈 입력의 첫 번째 문자를 검사하려고 시도 할 것입니다. – Robert

답변

0

을 확인한 후에 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). –

관련 문제