Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获得无接触异常_Java_Stringtokenizer_Nosuchelementexception - Fatal编程技术网

Java 获得无接触异常

Java 获得无接触异常,java,stringtokenizer,nosuchelementexception,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;

我必须用三个文本文件做一份报告。所以我想用数组存储文件数据。这是我正在使用的文本文件

    UnitID    UName  RNo     RName      Lect   RCapacity    StuEnrolled
    ECSC410;  SDP01; 21;    BreakRoom;  Dr.Fo;   6;             4;
    ECSI707;  SDP02; 23;    BreakRoom;  Dr.Fu;   8;             3;
这是我的密码。我得到了
NoTouchElementException
。我不明白为什么会这样。请帮我修一下

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;

} 
publicstaticarraylistgetrecords(){
ArrayList记录=新的ArrayList();
缓冲剂;
试一试{
br=新的BufferedReader(新的文件读取器(“G:\\讲师.txt”);
String line=br.readLine();
while(行!=null){
line=br.readLine();
记录。添加(行);
}
}捕获(FileNotFoundException ex){
Logger.getLogger(touch.class.getName()).log(Level.SEVERE,null,ex);
}捕获(IOEX异常){
Logger.getLogger(touch.class.getName()).log(Level.SEVERE,null,ex);
}
退货记录;
}
公共静态数组列表getExcellateDetails(){
ArrayList讲师详细信息=新建ArrayList();
for(字符串记录:getRecords()){
StringTokenizer令牌=新的StringTokenizer(记录“;”);
讲座=新讲座();
while(token.hasMoreTokens()){
setUnitID(token.nextToken().trim());
setUnitName(token.nextToken().trim());
讲座.setRoomNo(token.nextToken().trim());
setRoomName(token.nextToken().trim());
teaching.set讲师名称(token.nextToken().trim());
setRoomCapacity(Integer.parseInt(token.nextToken().trim());
setNoOfStudentsEnrolled(Integer.parseInt(token.nextToken().trim());
讲师详细信息。添加(讲师);
}
}
返回详细信息;
} 

谢谢大家!

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

        br = new BufferedReader(new FileReader("G:\\lecturer.txt"));
        String line = null;

        while ( (line=br.readLine()) != null){
            records.add(line);
        }
更新: 如果您这样做是为了跳过标题作为下面提到的评论员,那么您仍然可以保留在初始阅读行中:

        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());
        ...
    }

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

首先,使用
StringTokenizer
标记第一行数据,然后使用
hasMoreTokens()
检查数据是否有任何标记,然后将所有标记从数据中提取到
对象中。你想然后你得到下一行,但不是


然后,
while
循环使用
hasMoreTokens
再次检查第一个数据行,它仍然有最后一个标记,换行符。因此循环进入第二次运行,但这次数据只有一个标记,您会得到错误。

文本文件中的某些行不能有相同的列数!第一行不包含所有字符。文本文件中是否只有空格行?也许,最后一行?我想他这样做是为了跳过header@name_no他可能会这样做,但这意味着他正在阅读非行内容下的行,因此返回null。@name\u不感谢您指出这一点,我已经更新了问题以提供帮助@谢谢你!它起作用了。即使是附加信息也非常有用,因为我是Java新手。:)