如何在Java中处理NoSuchElementException?

问题描述 投票:0回答:2

我有一个从cvs文件中读取的Java程序,看起来像这样:

1111,John,23
2222,Mary,32 
...

我想将每个字段存储在一个数组中。每当我运行以下程序时,我都会收到以下消息:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)

我该如何处理该例外?我想这是因为扫描仪读取的数据超出了其限制,但是,while语句是否不能确保它会在其限制内读取?

感谢您的任何帮助

import java.util.*;
import java.io.*;

public class program
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        BufferedReader br = new BufferedReader(new FileReader("info.csv"));
        int[] ids = new int[20];
        String[] names = new String[20];
        int[] age = new int[20];

        String line;
        int i = 0;
        while( (line = br.readLine()) != null)
        {
            Scanner s = new Scanner(line).useDelimiter(",");
            ids[i] = s.nextInt();
            names[i] = s.next();
            sales[i] = s.nextInt();
            s.close();
            i++;
        }

       for(int j = 0; j < 20; j++)
       {
           System.out.println("Id: "+ids[i]+" Name: "+names[i]+" Age: "+ age[i]);
       }
    }
}
java file exception java.util.scanner
2个回答
1
投票

尝试使用split(,)

            String[] split = line.split(",");
            if (split.length >= 0) {
                String input = split[0];
                if (input.matches("[0-9]+"))
                    ids[i] = Integer.parseInt(input);
            }
            if (split.length >= 1) {
                names[i] = split[1];
            }

            if (split.length >= 2) {
                String input = split[2];
                if (input.matches("[0-9]+"))
                    ids[i] = Integer.parseInt(input);
            }

2
投票
  1. 读取CSV文件实际上非常复杂。处理引号和换行符非常困难。还有一些编码问题要考虑(您没有考虑过;您基本上不应该使用此构造函数FileReader,因为它使用的是“平台默认编码”)。不要重新发明轮子。使用类似super-csv的内容。

  2. while块可确保您读取每一行一次,并且不会超出文件末尾。每行您强制执行:一个int,一个字符串和一个int,句点。那就是崩溃发生的地方。文件末尾很可能有尾随换行符。一个简单的示例是检查line.trim()是否为空,如果是,则继续(continue;),而不尝试读取该行。

但是,实际上,不要动手,获得CSV解析器。

注意:如果您必须重新发明轮子,那么有很多更好,更轻松的方法来从文件中获取所有行。例如,Files.newBufferedReader(Paths.get("/path/to/whatsit"))甚至Files.lines(Paths.get("/path/to/whatsit")),这些方法也方便地默认为UTF-8,即一致的选择,而不是“掷硬币并祈祷”。

© www.soinside.com 2019 - 2024. All rights reserved.