获取 NoSuchElementException
Getting NoSuchElementException
我必须使用三个文本文件制作一份报告。所以我想到将文件数据存储在 arrays.This 是我正在使用的文本文件。
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;
}
谢谢!
您的问题出在缓冲 reader 的 while 循环中。您正在检查前一个值不为空,而不是检查下一个值!如果 line 不为空,则它满足您的条件,但是您将获取下一行并使用它。 Re-arrange 你的逻辑:
br = new BufferedReader(new FileReader("G:\lecturer.txt"));
String line = null;
while ( (line=br.readLine()) != null){
records.add(line);
}
更新:
如果你这样做是为了跳过 header 作为下面提到的评论者,那么你仍然可以留在你的初始 readLine:
br = new BufferedReader(new FileReader("G:\lecturer.txt"));
String line = br.readLine();
while ( (line=br.readLine()) != null){
records.add(line);
}
作为旁注:
StringTokenizer 是旧版 class,不建议使用。相反,您应该在 Strings:
上使用 split 方法
for (String record : records) {
String[] tokens = record.split(";");
lecture.setUnitID(tokens[0].trim());
lecture.setUnitName(tokens[1].trim());
...
}
那是因为你的逻辑错误和每一行都嵌入了换行符。
首先,您使用 StringTokenizer
对数据的第一行进行标记,然后使用 hasMoreTokens()
检查它是否有任何标记,然后将所有标记从中提取到您的 Lecture
对象中.你认为然后你得到下一行,但是没有。
然后 while
循环再次检查你的第一个数据行 hasMoreTokens
并且它仍然有一个最后的标记,即换行符。所以循环转到第二个 运行,但这次数据只有一个标记,你得到错误。
我必须使用三个文本文件制作一份报告。所以我想到将文件数据存储在 arrays.This 是我正在使用的文本文件。
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;
}
谢谢!
您的问题出在缓冲 reader 的 while 循环中。您正在检查前一个值不为空,而不是检查下一个值!如果 line 不为空,则它满足您的条件,但是您将获取下一行并使用它。 Re-arrange 你的逻辑:
br = new BufferedReader(new FileReader("G:\lecturer.txt"));
String line = null;
while ( (line=br.readLine()) != null){
records.add(line);
}
更新: 如果你这样做是为了跳过 header 作为下面提到的评论者,那么你仍然可以留在你的初始 readLine:
br = new BufferedReader(new FileReader("G:\lecturer.txt"));
String line = br.readLine();
while ( (line=br.readLine()) != null){
records.add(line);
}
作为旁注:
StringTokenizer 是旧版 class,不建议使用。相反,您应该在 Strings:
上使用 split 方法 for (String record : records) {
String[] tokens = record.split(";");
lecture.setUnitID(tokens[0].trim());
lecture.setUnitName(tokens[1].trim());
...
}
那是因为你的逻辑错误和每一行都嵌入了换行符。
首先,您使用 StringTokenizer
对数据的第一行进行标记,然后使用 hasMoreTokens()
检查它是否有任何标记,然后将所有标记从中提取到您的 Lecture
对象中.你认为然后你得到下一行,但是没有。
然后 while
循环再次检查你的第一个数据行 hasMoreTokens
并且它仍然有一个最后的标记,即换行符。所以循环转到第二个 运行,但这次数据只有一个标记,你得到错误。