2013-02-04 192 views
1

我有一个BufferedReader遍历一个CSV文件的行;当它到达文件的末尾,则返回以下错误:为什么这个BufferedReader返回空字符串而不是null?

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(); 
     } 
    } 
+1

你文件的最后一行包含一个空的'String',所以你应该检查'strLine.equals(“”)'是否是停止'while循环'的另一个条件。 –

+2

strLine.isEmpty()在语义上比strLine.equals更好(“”) –

+0

感谢Luiggi和Cyrille。你知道我的语法有什么问题吗?我仍然看到同样的错误。 (strLine = brReadMe.readLine())!= null &&!strLine.isEmpty()) – user2040880

回答

0

,如果你的文件的结尾是一个换行符,尝试退格到前一行的末尾,看看您是否仍然出现错误

+0

这比解决方案=更复杂。 –

1

你可以简单地修改这种方式代码:

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

这样,你的代码将忽略所有空行,不仅仅是在你的文件的末尾。

+0

谢谢你的Cyrille。非常有意义。我的代码必须做一些奇怪的事情,因为即使在进行建议的更改之后,我仍然看到相同的错误。 – user2040880

+0

尝试在[SSCCE](http://sscce.org)中重现问题,以便我们查看它。 –

+0

感谢您的帮助。我正在编辑代码以根据请求创建SSCCE,并发现当我删除int record = csv.processLine(strLine,input)时;行,我不再有错误。我会仔细看看它是什么。感谢大家提供非常快速和真正有用的提示。 – user2040880

0

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

版本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版本,如果串号,否则,如果他们是字符或空或其他任何东西,如果里面的代码将被忽略

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

抱歉,延迟响应。当我进入正则表达式时,月食会发脾气,我花了一段时间才弄清楚。选项1对我来说返回相同的错误,不幸的是我不能测试选项2。 – user2040880

1

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

相关问题