2012-11-09 46 views
2

前幾天我問了一個關於從文件中讀取的問題,直到輸入完成。我收到了一些我曾經學習過的回覆,但是我有一個與該主題有關的問題:爲什麼我必須使用一些額外的測試,「finally」子句和另一個try-catch,而不僅僅是:爲什麼捕捉EOFException不足以知道輸入已完成?

DataInputStream reading = null; 
try{ 
     reading = new DataInputStream(new FileInputStream("tes.t")); 
     while(true) 
     { 
      System.out.println(reading.readInt()); 
      System.out.println(reading.readDouble()); 
     } 
     }catch(IOException xxx){System.err.println("Error: " + reading.getMessage());} 
     catch(EOFException xxx){reading.close();} 

這是不夠的?我的意思是 - 只要我們到達EOF,我們就會有一個例外。否則,我們捕獲異常並打印錯誤消息。爲什麼我們需要額外的測試?這種方法有什麼問題?

編輯:好的,我現在明白爲什麼這是一件壞事。但如果我做這樣的代碼怎麼辦:

DataInputStream reading = null; 
try{ 
     reading = new DataInputStream(new FileInputStream("tes.t")); 
     while(reading.available()!=0) 
     { 
      System.out.println(reading.readInt()); 
      System.out.println(reading.readDouble()); 
     } 
     }catch(EOFException xxx){} 
     catch(IOException xxx){System.err.println("Error: " + reading.getMessage());} 

正在檢查reading.available()的值更好的測試輸入結束還是一樣糟糕?

+2

由於IOException在異常heirarchy中的EOFException的頂部,您的閱讀將永遠不會關閉。它實際上應該給你一些編譯錯誤。 – Jimmy

+0

哦,沒錯。我的不好,代碼被添加到帖子編輯器中,沒有編譯或測試 - 謝謝:) – Straightfw

+0

你想等一段時間,然後再檢查接受的答案。你會得到更多的眼睛和時間讓別人考慮你的問題。即使認爲你可能會在早期找到一個充分的,甚至是好的答案,作爲資源的網站將受益於額外的答案。 –

回答

3

使用異常來控制執行流程並不高雅。讀取文件時EOF是正常情況,所以應該以其他方式處理。

更優雅的代碼是:

byte[] buf = new byte[8192]; 
int nread; 
while ((nread = is.read(buf)) >= 0) { 
    // process the first `nread` bytes of `buf` 
} 

來源:Unknown buffer size to be read from a DataInputStream in java

這裏,你可以找到很好的explaintation爲什麼你不應該有例外控制流量:Why not use exceptions as regular flow of control?

+0

我明白了。謝謝:) – Straightfw

+0

我不知道這是否適用於此,OP正在使用一個'File',它不會是一個隨機流,但它將是一個非常固定的數據量來處理。即文件的長度。但是,作爲一般(非文件導向的方法)同意上述內容是有效的。 – Woot4Moo

+2

優雅可以辯論,IMO異常可以用來創建非常優雅的流量控制。然而,這不是;高效的,慣用的,通用的,實用的和不可讀的(用Java)來做到這一點。 –

0

您需要最後的條款來關閉資源。有可能沒有命中EOF,最後還是需要執行block。此外,上面的代碼是非常殘酷的,不應該在生產系統中使用,尤其是因爲您知道文件結束時的條件。理想情況下,其他審查過的人也發表了同樣的聲明。將異常視爲「正常」的程序執行流程是對軟件工程問題最不利的方法。

+0

哦,是的,我認爲這是殘酷的,我剛剛開始;) 謝謝! – Straightfw

+1

@Straightfw lol在評論中沒有任何傷害,只是很高興你將問題帶到這樣的網站,而不是傳播錯誤的代碼:) – Woot4Moo