1

我有一个 BufferedReader 遍历 CSV 文件的行;当它到达文件末尾时,它返回以下错误:

Exception in thread "main" java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:992)

如何让读者意识到它已到达文件末尾并且输入为空而不是空?我检查了文件,最后一行的末尾没有空格。

代码:

    File filReadMe = new File(inputFile);
    BufferedReader brReadMe = new BufferedReader(new InputStreamReader(new FileInputStream(filReadMe), "UTF-8"));

    try
    {
        String strLine;

        while ((strLine = brReadMe.readLine()) != null)
        {
            System.out.println(strLine);
            //place the line into CsvRecordFactory
            int record = csv.processLine(strLine, input); 
        }
    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        //Close the BufferedReader
        try {
            if (brReadMe != null)
                brReadMe.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
4

4 回答 4

1

问题不在于文件结尾。问题是您正在处理一个空白行,就好像它不是空白一样。可以想象,这可能发生在任何地方,而不仅仅是作为 EOF 之前的最后一行。在开始解析之前检查该行是否为空。

于 2013-02-04T22:48:31.233 回答
1

您可以通过这种方式简单地修改您的代码:

while ((strLine = brReadMe.readLine()) != null)
{
    if (!strLine.isEmpty()) {
        System.out.println(strLine);
        //place the line into CsvRecordFactory
        int record = csv.processLine(strLine, input); 
    }
}

这样,您的代码将忽略所有空行,而不仅仅是文件末尾的那些。

于 2013-02-04T20:27:55.363 回答
0

如果文件的末尾是换行符,请尝试将其退格到上一行的末尾,看看是否仍然出现错误

于 2013-02-04T20:23:07.707 回答
0

尝试给它一个小的if条件来检查字符串是否为空。

版本 1:检查字符串是否为空

  while ((strLine = brReadMe.readLine()) != null)
    {
          if(!strLine.isEmpty()){
              System.out.println(strLine);
              //place the line into CsvRecordFactory
              int record = csv.processLine(strLine, input); 
          }
    }

我也有代码版本 2,它检查字符串是否为数字,否则如果它们是字符或空或其他任何内容,则if中的代码将被忽略

while ((strLine = brReadMe.readLine()) != null)
        {
              if(strLine.matches("\\d+")){
                  System.out.println(strLine);
                  //place the line into CsvRecordFactory
                  int record = csv.processLine(strLine, input); 
              }
        }
于 2013-02-04T20:33:54.770 回答