【问题标题】:How to deal with NoSuchElementException in java?java中如何处理NoSuchElementException?
【发布时间】:2020-05-20 12:22:31
【问题描述】:

我有一个从 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


【解决方案1】:
  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,即一致的选择,而不是“抛硬币祈祷”。

【讨论】:

  • 我真的不同意第一部分。读取 CSV 文件是一项非常简单的任务,因为您通常不必在这里构建万事通设备。我的“更”复杂的解决方案之一是大约 100 行。在一堂课。一个额外的库不需要额外的开销,它只是添加另一个库。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,我添加了 ifs,但是,现在我收到 InputMismatchExceptionArrayIndexOutOfBoundsException,知道为什么会这样吗?
  • 我猜想在调用nextInt() 时缺少一些单元格尝试更新一个
  • 谢谢,那么 ArrayIndexOutOfBoundsexception 呢?
  • CSV 文件中的行数是否超过 20 行?
  • 不,它们正好是 20。异常归咎于 for 块中的打印部分
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多