【问题标题】:Reading data from a CSV file using scanner throws exception使用扫描仪从 CSV 文件中读取数据会引发异常
【发布时间】:2018-08-31 12:52:49
【问题描述】:

我最近才开始使用 Java,所以请多多包涵。我正在尝试通过从格式为

的 csv 文件中读取数据来创建对象 Product 的数组

Name,Price,Stock

但每次我尝试使用 Load() 函数时,它总是在 Product 构造函数行中给我一个错误。

  private Product[] product = new Product[100];

  public Product[] Load() throws FileNotFoundException {
    int  counter = 0;
    boolean end = false;

    Scanner scanner = new Scanner(new File("products.csv"));
    scanner.useDelimiter(",");

    while (!end) {
        if (scanner.hasNext()) {
            product[counter] = new Product(scanner.next(), scanner.nextFloat(), scanner.nextInt());
            counter++;
        }
        else {
            end = true;
        }

    }

    scanner.close();
    return product;
}

错误消息是java.util.scanner.next(unknown source)scanner.nextFloat()scanner.nextInt()

的错误相同
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at ScoutShop.CSVReader.Load(CSVReader.java:20)
at ScoutShop.Main.main(Main.java:11)

【问题讨论】:

  • 这肯定不是整个错误。
  • 你应该发布抛出异常的整个堆栈跟踪。
  • 我在最后添加了整个错误
  • 你在测试scanner.hasNext(),然后你做了三个scanner.next()
  • 如果scanner.hasNext() 为真,那么在该特定顺序中总会有名称价格和库存

标签: java csv java.util.scanner


【解决方案1】:

生成的java类也应该是products.csv的同一个位置。

或者尝试将 products.csv 放在根目录或 `C:\products.csv 中并执行(看看会发生什么):

 Scanner scanner = new Scanner(new File("C:\\products.csv"));

【讨论】:

    【解决方案2】:

    检查Java Docs 中的new File(String path) 知道您必须为尝试读取的文件指定确切的文件路径

    检查此答案以通过Scheintod 解析CSV Parsing errors 的CSV

    private Product[] product = new Product[100];
    public Product[] load() throws FileNotFoundException {
        int  counter = 0;
        Scanner scanner = new Scanner(new File("products.csv"));
        scanner.useDelimiter(",");
        // try the following while loop without use of if-else statements to 
        // avoid complexity in case of up scaling/maintaining your application 
        while(scanner.hasNext()){
             // System.out.print(scanner.next()+"|");
             product[counter] = new Product(scanner.next(), scanner.nextFloat(), 
             scanner.nextInt());
             counter++;
        }
        scanner.close();
        return product;
    }
    

    【讨论】:

    • 您是否指定了完整路径?
    • 是的,我添加了完整路径并删除了 if 条件,但在同一行代码中会弹出相同的错误
    • 请附上整个文件,我将在我的机器上测试它,并显示文件的完整路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2016-03-02
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多