简体   繁体   English

在Java中使用StringTokenizer时出现java.util.NoSuchElementException

[英]java.util.NoSuchElementException while using StringTokenizer in java

I am recently doing simple project on file reading, writing and comparing string in core java. 我最近正在做一个关于核心Java中文件读取,写入和比较字符串的简单项目。 I have used StringTokenizer for parsing each elements in line. 我已经使用StringTokenizer来解析行中的每个元素。 but while doing so, i encounter following error message. 但是这样做时,我遇到以下错误消息。 Any help regarding this, thanks in advance. 关于此的任何帮助,在此先感谢。 Error message: 错误信息:

Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at java.util.StringTokenizer.nextElement(Unknown Source)
at com.dhiraj.demo.ComparatorClass.main(ComparatorClass.java:64)

My code is like following; 我的代码如下:

String listtable = "listtable.dat";
    ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>();

    try(FileInputStream fis = new FileInputStream(listtable);
            BufferedReader bio = new BufferedReader(new InputStreamReader(fis))){
        String line;
        while((line = bio.readLine())!=null){
            System.out.println(line);
            StringTokenizer to = new StringTokenizer(line, "|");
            //while(tokens.hasMoreElements()){
                //System.out.println(tokens.nextElement());

                //Integer id = Integer.parseInt(to.nextElement().toString().trim());
            //  System.out.println(id);
                Integer id = Integer.parseInt(to.nextElement().toString());

                //int id = Integer.parseInt(to.nextElement().toString().trim());
                System.out.println("i am error");
                String fname = to.nextElement().toString().trim();
                String lname = to.nextElement().toString().trim();
                String address = to.nextElement().toString().trim();
                Integer age = Integer.parseInt(to.nextElement().toString().trim());


                ltc.add(new ListTableClass(id, fname, lname, address, age));

            //}
        }
    }catch(IOException e){
        System.out.println(e);

    }       
    for(ListTableClass t: ltc){
        System.out.println(t.getId());
        System.out.println(t.getFname());
        System.out.println(t.getLname());   
        System.out.println(t.getAddress());     
        System.out.println(t.getAge());         

    }

and file sample is: 文件示例是:

11120|bijaya|khanal|biratnagar|25
11121|chandramani|sapkota|hetauda|25
11117|Hari|Sapkota|bhaktapur|25
11118|pramod|chaulagain|banepa|25
11119|bigyan|shrestha|birjung|25
11120|bijaya|khanal|biratnagar|25
11114|suman|hamal|shangrila|25
11115|kishor|Neupane|Sanepa|25

I would start by adding a toString to ListTableClass , something like 我将从将toString添加到ListTableClass ,类似

public String toString() {
    return String.format("Id: %d%n" + //
            "Name (lname, fname): %s, %s%n" + //
            "Address: %s%n" + //
            "Age: %d",//
            id, lname, fname, address, age//
            );
}

Then I would prefer String.split(String) and a Scanner and to read the file from the user's home folder, and finally to program to the List interface (and use the diamond operator <> ) with the toString and you should probably check for emtpy lines like 然后,我希望使用String.split(String)Scanner并从用户的主文件夹中读取文件,最后使用toString编程到List接口(并使用菱形运算符<> ),您应该检查一下空行像

public static void main(String[] args) {
    String listtable = "listtable.dat";
    List<ListTableClass> ltc = new ArrayList<>();
    File f = new File(System.getProperty("user.home"), listtable);
    try (Scanner s = new Scanner(f)) {
        while (s.hasNextLine()) {
            String line = s.nextLine();
            if (line.trim().isEmpty()) {
                continue;
            }
            System.out.println(line);
            String[] to = line.split("|");
            Integer id = Integer.parseInt(to[0].trim());
            String fname = to[1].trim();
            String lname = to[2].trim();
            String address = to[3].trim();
            Integer age = Integer.parseInt(to[4].trim());
            ltc.add(new ListTableClass(id, fname, lname, address, age));
        }
    } catch (IOException e) {
        System.out.println("Caught Exception: " + e.getMessage());
        e.printStackTrace();
    }
    for (ListTableClass t : ltc) {
        System.out.println(t);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM