4 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊
這個問題其實(shí)無須過多困擾。也沒有必要往JDK1.7的try-with-resources上扯。
首先關(guān)閉資源放在try塊里一定會有問題:資源可能不被關(guān)閉。
所以資源的關(guān)閉應(yīng)該放在finally里,這沒有什么疑問。
至于finally塊里close資源會額外引入IOE
,這也是無法避免的。
目前(就我見到過的)絕大多數(shù)代碼里,捕獲IOE
后,最多打一條log,更多的是noop,即no operations,do nothing。
close的時候IOE發(fā)生的幾率很小,它應(yīng)該屬于一種操作系統(tǒng)層面的error,選擇忽略它是正確的選擇,畢竟你的系統(tǒng)不能因?yàn)橐粋€資源關(guān)閉錯誤而停止運(yùn)行。況且,如果你硬要捕獲這個IOE,那能做些什么呢。
如果不想在finally塊里引入try-catch,我見過guava的一種關(guān)閉方式,寫個工具方法叫做closeQuietly(),不吵不鬧就挺好。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個贊
同意1樓的答案,你補(bǔ)充的問題,也是由于IDE的問題。
另外對于實(shí)現(xiàn)了 AutoCloseable 和 Closeable 接口的資源,最好都使用 try-with-resources結(jié)構(gòu)。
以你的代碼作為例子,省略了一些代碼
try{
reader.readline();
}catch(IOException e){
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
假設(shè) readline 和 close 都發(fā)生io異常,使用 JDK1.7 前的異常捕捉結(jié)構(gòu),只能捕捉到 close 的異常,readline 的異常被抑制了。(因?yàn)?finally 的代碼必須執(zhí)行)
另外一個問題,在 try-with-resources 中資源的 AutoCloseable 的 close 方法什么時候執(zhí)行?
在執(zhí)行完 try 代碼塊的代碼之后就會執(zhí)行(這里不貼實(shí)驗(yàn)代碼了),所以使用 try-with-resources 的結(jié)構(gòu),catch 塊和 finally 塊都是在資源進(jìn)行關(guān)閉之后才會執(zhí)行的。
添加回答
舉報(bào)