获得NoSuchElementException

时间:2015-12-30 10:09:53

标签: java stringtokenizer 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;

} 

谢谢!

2 个答案:

答案 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,它仍然有一个最后一个标记,即换行符号。所以循环进入第二次运行,但这次数据只有一个令牌而你得到错误。