伊谢尔伦2017-04-18 09:27:05
這個問題其實無須過多困擾。也沒必要往JDK1.7的try-with-resources上扯。
先關閉資源放在try塊裡一定會有問題:資源可能不會被關閉。
所以資源的關閉應該放在finally裡,這沒有什麼疑問。
至於finally區塊裡close資源會額外引入IOE
,這也是無法避免的。 IOE
,这也是无法避免的。
目前(就我见到过的)绝大多数代码里,捕获IOE
目前(就我見過的)絕大多數程式碼裡,捕獲IOE
後,最多打一條log,更多的是noop,即no operations,do nothing。
close的時候IOE發生的幾率很小,它應該屬於一種作業系統層面的error,選擇忽略它是正確的選擇,畢竟你的系統不能因為一個資源關閉錯誤而停止運作。況且,如果你硬要捕捉這個IOE,那能做些什麼。
如果不想在finally區塊裡引入try-catch,我看過guava的一種關閉方式,寫個工具方法叫做closeQuietly(),不吵不鬧就挺好。
PHPz2017-04-18 09:27:05
謝邀
可以考慮Java7的try with resource
try (BufferedReader br = ...) {
//...
} catch (IOException ex) {
//...
}
參考
大家讲道理2017-04-18 09:27:05
同意1樓的答案,你補充的問題,也是由於IDE的問題。
另外對於實作了 AutoCloseable 和 Closeable 介面的資源,最好都使用 try-with-resources結構。
以你的程式碼作為範例,省略了一些程式碼
try{
reader.readline();
}catch(IOException e){
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
假設 readline 和 close 都發生io異常,使用 JDK1.7 前的異常捕捉結構,只能捕捉到 close 的異常,readline 的異常被抑制了。 (因為 finally 的程式碼必須執行)
另一個問題,在 try-with-resources 中資源的 AutoCloseable 的 close 方法什麼時候執行?
在執行完 try 程式碼區塊的程式碼之後就會執行(這裡不貼實驗程式碼了),所以使用 try-with-resources 的結構,catch 區塊和 finally 區塊都是在資源進行關閉之後才會執行的。