天天看點

Java IO: 異常處理

流與reader和writer在結束使用的時候,需要正确地關閉它們。通過調用close()方法可以達到這一點。不過這需要一些思考。請看下邊的代碼:

第一眼看這段代碼時,可能覺得沒什麼問題。可是如果在調用dosomethingwithdata()方法時出現了異常,會發生什麼呢?沒錯,這個inputstream對象就不會被關閉。

為了避免異常造成流無法被關閉,我們可以把代碼重寫成這樣:

注意到這裡把inputstream的關閉代碼放到了finally塊中,無論在try-catch塊中發生了什麼,finally内的代碼始終會被執行,是以這個inputstream總是會被關閉。

但是如果close()方法抛出了異常,告訴你流已經被關閉過了呢?為了解決這個難題,你也需要把close()方法寫在try-catch内部,就像這樣:

這段解決了inputstream(或者outputstream)流關閉的問題的代碼,确實是有一些不優雅,盡管能夠正确處理異常。如果你的代碼中重複地遍布了這段醜陋的異常處理代碼,這不是很好的一個解決方案。如果一個匆忙的家夥貪圖友善忽略了異常處理呢?

此外,想象一下某個異常最先從dosomethingwithdata方法内抛出。第一個catch會捕獲到異常,然後在finally裡程式會嘗試關閉inputstream。但是如果還有異常從close()方法内抛出呢?這兩個異常中得哪個異常應當往調用棧上傳播呢?