Java異常處理之try...catch...finally詳解

異常處理機制已經成為判斷一門編程語言是否成熟的標準之一,其對代碼的健壯性有很大影響 。一直以來異常處理使用不是很得心應手,今天對異常進行了較為深入的學習,這篇主要是對try…catch…finally的一個總結 。
一.java繼承體系
Java語言為異常處理提供了豐富的異常類,這些類之間有嚴格的繼承關系 。如圖:

Java異常處理之try...catch...finally詳解


從圖中我們可以看出,所有的類都是繼承于Throwable這個父類,java將所有的非正常情況分為兩種:Error(錯誤)和Exception(異常),Error錯誤一般是于虛擬機相關的問題,如系統崩潰、虛擬機錯誤、動態鏈接失敗等,這種錯誤是無法恢復或不可能捕獲的,而我們能處理的是Exception類下的錯誤 。Exception則分為兩大類,RuntimeException(運行時異常)和其他異常(Checked異常),其他異常(Checked異常)是各種形式的編譯錯誤,是我們必須顯示處理才可以通過變異的;而運行時錯誤顧名思義就是程序已經通過了編譯,在運行時出現的錯誤,若是對這些異常置之不理會導致程序停止運行、占用資源無法釋放甚至導致系統崩潰 。
二.java異常處理機制及實現方法
1.主要依賴于try、catch、finally、throw和throws這五個關鍵字 。(throw和throws本篇不涉及)
2.try…catch…finally處理機制:try關鍵字后跟一個花括號栝起的代碼塊(即使該代碼塊只有一行也不能省略花括號),簡稱try塊 。catch對應異常類型和代碼塊,用于表明更改catch塊用于處理該種類型的異常 。一個try塊后可以跟多個catch塊 。在catch塊后還可以跟一個finally塊,finally塊用于回收在try塊里打開的資源 。
這樣講過于抽象,那我們看幾個例子:
e.g.1 try…catch語句塊
Java異常處理之try...catch...finally詳解


以上代碼我們看到,對不同的異常情況作了不同的處理:輸入參數不夠會發生數組越界異常、輸入參數不是數字發生數字格式異常、若輸入第二個數是0,則發生除0異常,調用算術異常進行處理、出現其他異常時那么該異常對象必定是Exception類或其子類的實例,java調用Exception類對其進行處理,前三種異常類均是RuntimeException的子類 。在使用try…catch語句塊時需要知道或注意以下幾點:
1) 處理過程:代碼在執行的時候,進入try塊,若是在try塊中出現了異常,系統會自動生成一個一場對象,該對象被提交給java運行時環境,這就是異常的拋出;在java運行時環境收到異常對象時則把該對象交給catch塊處理,這個過程叫做異常的捕獲;若找到相應的catch塊就執行catch塊中的代碼,若沒有找到,則運行時環境終止,程序也退出 。
2) 執行一次try塊只執行一個catch塊
3) 有多個catch塊并有繼承關系的情況下必須先寫子類后寫父類(即先捕獲小異常再捕獲大異常),若寫反在編譯時就會報錯
4) Java7提供的多異常捕獲:在Java7之前,每一個catch塊只能捕獲一種異常,但從java7開始,一個catch塊可以捕獲多種類型的異常 。在使用多異常捕獲應注意兩點:
(1) 多種異常之間用豎線( | )隔開
(2) 多種異常對象被final隱式修飾,因此程序不能對其重新賦值
以下代碼是多異常捕獲的例子:
e.g.2
Java異常處理之try...catch...finally詳解


可以看出,以上代碼中,①號代碼是錯誤的,因為ie是被final隱式修飾的對象,②號代碼是正確的
3. 使用finally回收資源:有些時候我們在try塊中打開了一些物理資源(例如數據庫鏈接、網絡連接和磁盤文件等),這些資源都應進行顯示回收 。有人說java不是有垃圾回收機制嗎?java的垃圾回收機制是自動回收堆內存中對象所占用的內存,而物理資源是不會自動回收的 。

推薦閱讀