为什么在解析第一个字符串数组中的数据时抛出异常,而跳过第一个数组时却没有?

e5njpo68  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(316)

在我的系统中,我有一个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”。
但如果跳过第一个数组(第一个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文件有关?我用的阅读器?
有人知道这个问题吗?有人能帮我吗?

rjzwgtxy

rjzwgtxy1#

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

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

一般来说,您应该在解析输入之前对其进行清理。例如,如果它是一个数值, trim() 在把绳子喂给你之前 parseInt() .

fhg3lkii

fhg3lkii2#

你的分析不够。您得到的错误显示一个单元格包含一个带前导空格的数字。
java.lang.numberformatexception:对于输入字符串:“27”
对该单元格值调用integer.parseint()。根据文档,parseint()拒绝前导空格。
在调用parseint之前,需要修剪该值。请参见string.trim()。

vatpfxk5

vatpfxk53#

你得到这些错误,因为你的号码有一个前导空格。你可以用 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+", ""));

这将从字符串中删除所有非数字。

相关问题