2015-12-30 51 views
0

我必須使用三個文本文件進行報告。所以我想在數組中存儲文件數據。這是我正在使用的文本文件。獲取NoSuchElementException

UnitID UName RNo  RName  Lect RCapacity StuEnrolled 
    ECSC410; SDP01; 21; BreakRoom; Dr.Fo; 6;    4; 
    ECSI707; SDP02; 23; BreakRoom; Dr.Fu; 8;    3; 

這是我的代碼。我得到了NoSuchElementException。我無法弄清楚爲什麼會發生這種情況。請幫我解決它。

public static ArrayList<String> getRecords() { 
    ArrayList<String> records = new ArrayList<>(); 

    BufferedReader br; 
    try { 
     br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = br.readLine(); 

     while (line != null){ 
      line = br.readLine(); 
      records.add(line); 

     } 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Lecture.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(Lecture.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return records; 

} 

public static ArrayList<Lecture> getLectureDetails(){ 
    ArrayList<Lecture> lectureDetails = new ArrayList<>(); 



    for (String record : getRecords()){ 
     StringTokenizer token = new StringTokenizer(record, ";"); 
     Lecture lecture = new Lecture(); 

     while(token.hasMoreTokens()){ 
      lecture.setUnitID(token.nextToken().trim()); 
      lecture.setUnitName(token.nextToken().trim()); 
      lecture.setRoomNo(token.nextToken().trim()); 
      lecture.setRoomName(token.nextToken().trim()); 
      lecture.setLecturerName(token.nextToken().trim()); 
      lecture.setRoomCapacity(Integer.parseInt(token.nextToken().trim())); 
      lecture.setNoOfStudentsEnrolled(Integer.parseInt(token.nextToken().trim())); 

      lectureDetails.add(lecture); 
     } 
    } 
    return lectureDetails; 

} 

謝謝!

+0

文本文件中的某些行不能有相同的列數! –

+0

第一行doest沒有全部列表 – msangel

+0

你的文本文件中是否有空行?可能是最後一行? – dejvuth

回答

0

你的問題在於你緩衝閱讀器的while循環。你正在檢查以前的值不是null,而不是檢查下一個!如果line不爲null,它會滿足您的條件,但您將獲得下一行並使用它。重新安排你的邏輯:

 br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = null; 

     while ((line=br.readLine()) != null){ 
      records.add(line); 
     } 

更新: 如果你這樣做會忽略標題如下所述完全正確,那麼你仍然可以在初始的readLine留下評論者:

 br = new BufferedReader(new FileReader("G:\\lecturer.txt")); 
     String line = br.readLine(); 

     while ((line=br.readLine()) != null){ 
      records.add(line); 
     } 

作爲一個方面說明:

的StringTokenizer是傳統類,不建議使用。相反,你應該做的字符串使用分割方法:

for (String record : records) { 

     String[] tokens = record.split(";"); 

     lecture.setUnitID(tokens[0].trim()); 
     lecture.setUnitName(tokens[1].trim()); 
     ... 
    } 
+0

我認爲他這樣做是爲了跳過標題 –

+0

@name_no他可以這樣做,但這意味着他正在閱讀不是一行內容的行,因此返回null。 – MasNotsram

+0

@name_no感謝您指出這一點,但我已經更新了這個問題以幫助! – MasNotsram

0

那是因爲你有嵌入到每一行的邏輯和換行符兩個錯誤。

首先,您記號化數據的第一線與StringTokenizer,比你檢查它有任何標記與hasMoreTokens(),然後你拉從它所有的令牌加入到Lecture對象。你認爲你會得到下一條線,但沒有。

然後while循環再次檢查您的第一條數據行與hasMoreTokens,它仍然有最後一個令牌,換行符號。所以循環進行到第二次運行,但是這次數據只有一個令牌,並且你得到錯誤。

相關問題