2013-02-04 215 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之前的最後一行。在開始解析之前檢查線條是否爲空。

相關問題