2012-12-12 3 views
0

ArrayIndexOutOfBoundsException을 수정하는 데 가장 힘든 시간을 보내고 있습니다.퀴즈 프로그램에서 배열 인덱스가 범위를 벗어나는 예외

파일에서 한 줄씩 읽는 방법이 있습니다. 행의 이름과 ID가 메소드에 전달하는 일부 변수와 일치하면 그 행을 배열에 저장합니다.

이 프로그램은 퀴즈를 시뮬레이션합니다. 사용자는 동일한 이름과 ID를 두 번 이상 사용할 수 없습니다. 따라서 파일에는 이름과 ID가 같은 두 줄만 포함됩니다.

temp이라는 배열을 만들어 파일에서이 두 줄을 유지합니다. 파일이 비어 있으면 사용자는 두 번 시도하고 다시 시도하면 거부됩니다. 따라서 다른 이름과 ID를 입력하면 2 번 더 시도해야합니다. 이 시점에서 파일에는 이전 사용자의 두 줄이 있지만 새 사용자가 시도 할 때 한 번만 테스트를 수행 할 수 있습니다. 그가 두 번째 시간을 시도 할 때 배열 예외를 벗어났습니다.

제 질문은 배열 temp에 이전 값이 들어있어 예외가 발생하는 이유는 무엇입니까?

private String readFile(String id, String name) { 
    String[] temp = new String[3]; 
    int i = 1; 
    int index = 0; 
    String[] split = null; 
    String idCheck = null; 
    String nameCheck = null; 
    temp = null; 

    try { 
     BufferedReader read = new BufferedReader(new FileReader("studentInfo.txt")); 
     String line = null;   

     try { 
      while ((line = read.readLine()) != null) { 
       try { 
        split = line.split("\t\t"); 
       } catch (Exception ex) { 
       } 

       nameCheck = split[0]; 
       idCheck = split[1]; 

       if (idCheck.equals(id) && nameCheck.equals(name)) { 
        temp[index] = line; 
       } 

       index++; 
      } 
      read.close(); 
     } catch (IOException ex) { 
     } 
    } catch (FileNotFoundException ex) { 
    } 

    if (temp != null) { 
     if (temp[1] == null) { 
      return temp[0]; 
     } 
     if (temp[1] != null && temp[2] == null) { 
      return temp[1]; 
     } 
     if (temp[2] != null) { 
      return temp[2]; 
     } 
    } 

    return null; 
} 
+2

정확한 예외 라인 수를 표시하는 스택 추적이 필요합니다. – jn1kk

+2

여기에 IOOB 예외가 생깁니다 -'idCheck = split [1];'- 라인에 이중 탭이없는 경우. – Jivings

+0

'temp [index] = line;'-> 이것은 문제가있는 것처럼 보입니다.위의'if' 문을 만나는 파일이 3 줄 이상 있다면'ArrayOutOfBoundsException'으로 끝날 것입니다. – Laf

답변

0

String[] split = "xxx\tyyyy".split("\t\t"); 
    System.out.println(split[0]); 
    System.out.println(split[1]); 

을 발생 될 수 있습니다 것입니다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at Test.main(Test.java:17) 
1

인덱스가 범위를 벗어날 수있는 곳은 두 곳입니다. 라인이 "\t\t" 순서가없는

try { 
    split = line.split("\t\t"); 
} catch (Exception ex) { 
} 
nameCheck = split[0]; 
idCheck = split[1]; 

경우, split는 하나의 요소를 가지고 예외가 발생합니다 split[1]에 액세스하려고합니다 : 우선이 코드입니다. (제쳐두고 : 예외를 조용히 무시해서는 안됩니다!)

두 번째 (문제의 원인 일 가능성이 높음)는 ID와 이름이 일치하는 모든 행에 대해 index을 증가시키고 있다는 것입니다. 세 번째 줄, indextemp에 대한 아래 첨자로 범위를 벗어납니다.

는 당신도 당신의 while 루프 조건에 index < temp.length를 포함 할 수 있습니다, 또는 당신은 대신 String[]temp에 대한 ArrayList<String>를 사용할 수 있습니다. 그렇게하면 문자열을 무제한으로 추가 할 수 있습니다. 온도에 temp = null;

다음 참조를 설정 한 후

0

은 다음과 같습니다

if (idCheck.equals(id) && nameCheck.equals(name)) { 

    temp[index] = line; 
} 

난 당신이 라인 temp = null;을 제거해야합니다 생각합니다. 모든 행은 그 행 위에 인스턴스화 한 배열을 휴지통으로 처리합니다.

인덱스 나 터치 신경 만드는

하지만 파일이 3 개 이상의 라인을 가지고하지 않습니다 읽을 것이 확실하면 나는 가정 ...

관련 문제