我得用三个文本文件做报告。因此,我认为在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;
} 谢谢!
发布于 2015-12-30 12:02:06
您的问题在于缓冲的读取器的while循环。您正在检查前面的值不是null,而不是检查下一个!如果行不是null,则它满足您的条件,但是您将得到下一行并使用它。重新安排你的逻辑:
br = new BufferedReader(new FileReader("G:\\lecturer.txt"));
String line = null;
while ( (line=br.readLine()) != null){
records.add(line);
}Update:如果您这样做是为了跳过标题,下面提到的注释非常正确,那么您仍然可以保留在初始readLine中:
br = new BufferedReader(new FileReader("G:\\lecturer.txt"));
String line = br.readLine();
while ( (line=br.readLine()) != null){
records.add(line);
}作为附带说明:
StringTokenizer是一个遗留类,不建议使用。相反,您应该使用String上的拆分方法:
for (String record : records) {
String[] tokens = record.split(";");
lecture.setUnitID(tokens[0].trim());
lecture.setUnitName(tokens[1].trim());
...
}发布于 2015-12-30 12:04:43
这是因为在每一行中都嵌入了逻辑错误和行中断。
首先,用StringTokenizer标记数据的第一行,而不是用hasMoreTokens()检查它是否有任何标记,然后将所有标记从它中提取到Lecture对象中。你以为你会得到下一条线,但没有。
然后,while循环使用hasMoreTokens再次检查您的第一行数据,它还有最后一个标记,即换行符号。因此,循环转到第二次运行,但这次数据只有一个令牌,您将得到错误。
https://stackoverflow.com/questions/34527335
复制相似问题