我必须使用三个文本文件进行报告。所以我想把文件数据存储在数组中。这是我正在使用的文本文件。
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)
您的问题在于缓冲读卡器的while循环。您正在检查之前的值是否为空,而不是检查下一个值!如果行不为空,则它满足您的条件,但您将获得下一行并使用它。重新安排你的逻辑:
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是遗留类,不建议使用。相反,你应该在字符串上使用split方法:
for (String record : records) {
String[] tokens = record.split(";");
lecture.setUnitID(tokens[0].trim());
lecture.setUnitName(tokens[1].trim());
...
}
答案 1 :(得分:0)
那是因为你在每一行都有逻辑错误和换行符。
首先,您使用StringTokenizer
对数据的第一行进行标记,而不是检查它是否包含hasMoreTokens()
的任何标记,然后将所有标记从中提取到Lecture
对象中。你认为然后你得到了下一行,但没有。
然后while
循环再次检查您的第一个数据行hasMoreTokens
,它仍然有一个最后一个标记,即换行符号。所以循环进入第二次运行,但这次数据只有一个令牌而你得到错误。