获取 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 并且它仍然有一个最后的标记,即换行符。所以循环转到第二个 运行,但这次数据只有一个标记,你得到错误。