如何处理java中的NoSuchElementException?

How to deal with NoSuchElementException in java?

我有一个 java 程序从 cvs 文件中读取,如下所示:

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)

我该如何处理这个异常?我猜是因为 scanner 读取超出了它的限制,然而,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]);
       }
    }
}
  1. 读取CSV文件其实很复杂。处理引号和换行符非常困难。还有一些编码问题需要考虑(你没有考虑;你基本上不应该使用这个构造函数 FileReader,因为它使用 'platform default encoding')。不要重新发明这个轮子;使用像 super-csv.

  2. 这样的东西
  3. while 块确保您读取每一行一次,并且不会超出文件末尾的范围。每行你强行去:一个 int,一个字符串,和一个 int,句点。这就是崩溃发生的地方。很可能在文件末尾有一个尾随换行符或类似的东西。一个简单的例子是检查 line.trim() 是否为空,如果是,则继续前进 (continue;) 而不要尝试读取该行。

但是,真的,不要手动操作,获取 CSV 解析器。

注意:如果你必须重新发明这个轮子,有更好更简单的方法来从文件中获取所有行。例如,Files.newBufferedReader(Paths.get("/path/to/whatsit")) 甚至 Files.lines(Paths.get("/path/to/whatsit")),方便的是这些方法也默认为 UTF-8,即一致的选择而不是 'flip a coin and pray'。

尝试使用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);
            }