首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取NoSuchElementException

获取NoSuchElementException
EN

Stack Overflow用户
提问于 2015-12-30 10:09:52
回答 2查看 79关注 0票数 0

我得用三个文本文件做报告。因此,我认为在arrays.This中存储文件数据是我正在使用的文本文件。

代码语言:javascript
复制
    UnitID    UName  RNo     RName      Lect   RCapacity    StuEnrolled
    ECSC410;  SDP01; 21;    BreakRoom;  Dr.Fo;   6;             4;
    ECSI707;  SDP02; 23;    BreakRoom;  Dr.Fu;   8;             3;

这是我的密码。我拿到NoSuchElementException了。我搞不懂为什么会这样。请帮我修一下。

代码语言:javascript
复制
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;

} 

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-30 12:02:06

您的问题在于缓冲的读取器的while循环。您正在检查前面的值不是null,而不是检查下一个!如果行不是null,则它满足您的条件,但是您将得到下一行并使用它。重新安排你的逻辑:

代码语言:javascript
复制
        br = new BufferedReader(new FileReader("G:\\lecturer.txt"));
        String line = null;

        while ( (line=br.readLine()) != null){
            records.add(line);
        }

Update:如果您这样做是为了跳过标题,下面提到的注释非常正确,那么您仍然可以保留在初始readLine中:

代码语言:javascript
复制
        br = new BufferedReader(new FileReader("G:\\lecturer.txt"));
        String line = br.readLine();

        while ( (line=br.readLine()) != null){
            records.add(line);
        }

作为附带说明:

StringTokenizer是一个遗留类,不建议使用。相反,您应该使用String上的拆分方法:

代码语言:javascript
复制
    for (String record : records) {

        String[] tokens = record.split(";");

        lecture.setUnitID(tokens[0].trim());
        lecture.setUnitName(tokens[1].trim());
        ...
    }
票数 0
EN

Stack Overflow用户

发布于 2015-12-30 12:04:43

这是因为在每一行中都嵌入了逻辑错误和行中断。

首先,用StringTokenizer标记数据的第一行,而不是用hasMoreTokens()检查它是否有任何标记,然后将所有标记从它中提取到Lecture对象中。你以为你会得到下一条线,但没有。

然后,while循环使用hasMoreTokens再次检查您的第一行数据,它还有最后一个标记,即换行符号。因此,循环转到第二次运行,但这次数据只有一个令牌,您将得到错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34527335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档