1. 程式人生 > >java基礎類庫學習(四.2)異常處理的陷阱

java基礎類庫學習(四.2)異常處理的陷阱

前言

java的異常類Exception繼承自非正常情況類Throwable,異常類下又分為兩大類:checked異常和runtime異常,

其中發生checked異常的類如果不做處理程式會發生編譯錯誤,導致程式中斷編譯

而runtime異常的類只有在執行階段才會發生,如果不做處理,程式會終斷執行

為保證編譯的順利執行,java規定開發者必須在程式內處理checked異常的例項,對其進行捕獲處理或者將其丟擲由上一級呼叫者處理,

而runtime異常則可不進行處理

陷阱?

1使用finally塊正確關閉資源的方式

finally{

if(ois!=null){

try{

ois.close();

}

catch(Exception e){

}
}

}

//關閉物理資源必須顯示關閉,因為垃圾回收機制不負責回收物理資源

//使用finally塊來顯示關閉物理資源,保證關閉操作總是被執行

//為防止空指標異常,關閉物理資源前保證引用該資源的變數不為null

//為保證關閉資源時引發的異常不會影響其他資源的關閉,應為每個資源的關閉使用try/catch塊

誰說finally塊必須執行?

try-catch-finally塊中,finally塊在以下幾種情況將不會執行。

(1)finally塊中發生了異常。

(2)程式所線上程死亡。

(3)在前面的程式碼中用了System.exit();,停止當前執行緒,程式退出

(4)關閉了CPU

finally塊如果不執行那麼物理資源怎麼釋放?

其中執行System.exit()語句後,虛擬機器在退出時也會執行物理資源的清理操作,即雖然未執行finally操作也還是進行了物理資源的關閉,這種關閉資源的方式時通過關閉鉤子的方式實現的,即程式需要顯示的註冊關閉鉤子,在關閉鉤子中實現物理資源的關閉,虛擬機器在退出時會自動執行關閉鉤子

有如下的迷惑程式碼,為了保證finally塊總是被執行你就會清醒一些了?

try{

throw new Exception("");

}

finally{

return 0;

}

系統執行throw語句時。為保證fianlly塊總被執行,因此先不立刻丟擲異常,先檢查有沒有finally塊,若有則執行,return了方法結束,將不會丟擲異常,程式正常編譯執行

在catch塊內儘可能對異常進行修復,再次呼叫方法避免異常繼續產生,否則有可能會導致迴圈遞迴,發生StackOverFlow錯誤