2012-01-10 2 views
2

데이터 파일의 각 행을 배열 목록으로 읽고 해당 목록을 섞은 다음 셔플 링 된 데이터에 대해 몇 가지 추가 작업을 수행하는 Java 코드를 작성 중입니다. 문제는 셔플 후에 배열 목록의 일부 요소에 대해 null 요소를 가져 오는 것입니다. rowData로 작업 할 때 코드를 실행에Collections.shuffle (List) 다음에 Null 행이 나타나는 이유는 무엇입니까?

//this file contains the data 
String input = ...; 
//this file contains the number of rows in the data file 
String input2 = ...; 
FileInputStream fstream2 = new FileInputStream(input2); 
DataInputStream in2 = new DataInputStream(fstream2); 
BufferedReader brIndex = new BufferedReader(new InputStreamReader(in2)); 

for(int i = 1; i <= N; i++) { 
     FileInputStream fstream = new FileInputStream(input+(i+1)+".txt"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader brData = new BufferedReader(new InputStreamReader(in)); 
     num = Integer.parseInt(brIndex.readLine()); 

     ArrayList<String> temp = new ArrayList<String>(); 
     for(int j = 0; j < num; j++) { 
      temp.add(brData.readLine()); 
     } 
     brData.close(); 
     Collections.shuffle(temp); 

     //read in shuffled data 
     for(int j = 0; j < num; j++) { 
      rowData = temp.get(j); ... 
} 

는,이 후 NullPointerException를 얻을. 원본 파일의 행은 17,169 개 (모두 null이 아님)입니다. temp.size()도 17,169이지만 콘솔에 온도 조절기를 인쇄했을 때 temp.get(j)은 일부는 j이고 다른 사람은 null이 아닙니다.

아무에게도 이것이 왜 그런 경우이며 어떻게 피할 수 있습니까?

답변

3

파일에 행 수가 충분하지 않아서 num으로 문제가 발생했을 수 있습니다.

시도 :

List<String> temp = new ArrayList<String>(); 
String line; 
while((line = br.readLine()) != null) { 
    temp.add(brData.readLine()); 
} 

셔플 목록에 새로운 요소를 삽입하지 않는 한 당신이 실제로 목록 셔플하기 전에 당신은 또한 목록에 null 요소를 확인할 수 있습니다.

+0

흥미 롭 ... 파일을 열어서 17,169 행의 데이터가 있는지 확인할 수 있습니다. 그러나 내가 제안한대로 13,000 행만 읽습니다 (temp.add (줄) 여야 함). 그래서 나는 왜 셔플 후 약 4,169 개의 ​​널 요소가 흩어지고 있는지 설명합니다. 내가 이해 못하는 것은 ... 다른 4,169 행에 무슨 일이 일어 났는가? – occasionalUser

+0

아 ... 죄송합니다, 방금 실수를 발견했습니다. 나는 잘못된 파일을 읽고 있었다. :) 내가 읽은 파일에는 13000 개의 행이있었습니다. – occasionalUser

1

readLine()이 null을 반환하는지 여부는 절대 확인하지 마십시오. 그것을 확인하면 아마도 파일의 마지막을 읽었을 것입니다.

또한 독자, 작성자 및 스트림은 항상 finally 블록에서 닫아야합니다.

+0

나는 try, catch 그리고 finally와 함께 예외 처리에주의하지 않는다는 것을 인정한다. 나는 당신이 제안한대로 그렇게하기 위해 더 많은주의를 기울여야한다. 지금은 워크 플로우에 포함되지 않았습니다. 이 코드와 모든 데이터 파일은 모두 나만 만들거나 볼 수 있습니다. 그래서, 나는 조금 게으르다 고 생각합니다. – occasionalUser