为什么解析第一个字符串数组中的数据时会引发异常,而跳过第一个数组却不会引发异常?

问题描述

在我的系统中,我有一个Excel阅读器,它也可以读取csv文件

这是我读取csv文件的方式:

        Path path = Paths.get(this.getFilePath());
        CSVParser parser = new CSVParserBuilder().withSeparator(';').build();

        try(BufferedReader br = Files.newBufferedReader(path,StandardCharsets.UTF_8);
            CSVReader reader = new CSVReaderBuilder(br).withCSVParser(parser).build()) {

            rows = reader.readAll();

这有效。 csv文件中的数据存储在字符串数组列表中。

现在,当从列表中读取我不理解的数据时,我注意到了一些东西。

这是我从列表中读取数据的方式:

if (rows != null && rows.size() > 1) {
            for (String[] row : rows) {
                                    
                int i = Integer.parseInt(row[0]);
                String name = row[1];
                double d = Double.parseDouble(row[2].replace(",","."));

            }
        }

如果从列表中获取一个数组,并且将数组中的第一个字符串从String解析为int,则 java.lang.NumberFormatException:对于输入字符串:抛出“ 27” 。 / p>

但是如果跳过了第一个数组(第一行excel行):

            if (rows != null && rows.size() > 1) {
            for (int i = 1; i < rows.size(); i++) {  //i = 1,skipp first array(excel line)
                String[] row = rows.get(i);

                int i = Integer.parseInt(row[0]);
                String name = row[1];
                double d = Double.parseDouble(row[2].replace(","."));

            }
        }

这样,不会引发java.lang.NumberFormatException:对于输入字符串:会被抛出。

我不明白,如果不跳过第一个数组(excel行),为什么会引发java.lang.NumberFormatException。

excel文件的第一行是必需的,不应跳过。它可以与读取excel文件有关吗?与读者一起使用吗?

有人知道这个问题吗?有人可以帮助我吗?

解决方法

出现这些错误,因为您的电话号码前有空白。您可以在解析数字之前使用trim。这些应该删除空白和解析错误。

        if (rows != null && rows.size() > 1) {
        for (int i = 1; i < rows.size(); i++) {  //i = 1,skipp first array(excel line)
            String[] row = rows.get(i);

            int i = Integer.parseInt(row[0].trim());
            String name = row[1];
            double d = Double.parseDouble(row[2].replace(",","."));

        }
    }

您也可以尝试:

Integer.parseInt(row[0].replaceAll("\\D+",""));

这将从字符串中删除allnon数字。

,

它要解析的字符串的前导空格为“ 27”。这就是导致错误的原因。以下代码也会引发异常:

public class MyClass {
    public static void main(String args[]) {
      int i = Integer.parseInt(" 27");
      System.out.println(i);
    }
}

一般而言,您应该在解析输入之前对输入进行清理。例如,如果它将是一个数字值,请先trim()个字符串,然后再将其提供给parseInt()

,

您的解析不充分。您收到的错误表明一个单元格包含一个带前导空格的数字。

java.lang.NumberFormatException:对于输入字符串:“ 27”

您在此单元格值上调用Integer.parseInt()。根据其文档,parseInt()拒绝前导空格。

在调用parseInt之前,您需要修整该值。参见String.trim()。