異常:運行期出現的錯誤
Java異常是Java提供的用於處理常式中錯誤的一種機制
所謂錯誤是指在程式啟動並執行過程中發生的一些例外狀況事件(如:除0溢出,數組下標越界,所要讀取的檔案不存在)
設計良好的程式應該在異常發生時提供處理這些錯誤的方法,使得程式不會因為異常的發生而阻斷或產生不可預見的結果
Java程式的執行過程中如出現例外狀況事件,可以生產一個異常類對象,該異常對象封裝了例外狀況事件的資訊並將被提交給Java運行系統,這個過程成為拋出(throw)異常
當Java運行時系統接受到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交給其處理,這一過程成為捕獲(catch)異常
在 Java 中,所有的異常都有一個共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程式傳輸的任何問題的共性。
Throwable 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。
Error:稱為錯誤,由Java虛擬機器產生並拋出,包括動態連結失敗、虛擬機器錯誤等,程式對其不做處理
Exception:異常類的父類,其子類對應了各種各樣可能出現的例外狀況事件,一般需要使用者顯式的聲明或捕獲
Runtime Exception:一類特殊的異常,如被除、數組下標越界等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對程式可讀性和運行效率影響很大。因此由系統自動檢測並將它們交給預設的例外處理常式(使用者可不必對其處理)
異常的捕獲和處理
Try語句
Try{...} 語句指定了一段代碼,該段代碼就是一次捕獲並處理例外的範圍。
在執行過程中,該段代碼可能會產生並拋出一種或幾種類型的異常對象,它後面的catch語句要分別對這些異常做相應的處理,若拋出異常,則在try塊中該異常語句之後的語句都不執行
如果沒有例外產生,所有的catch程式碼片段都被掠過不執行
Catch語句
在catch語句塊中是對異常進行處理的代碼,每個try語句塊可以隨一個或多個catch語句,用於處理可能產生的不同類型的異常對象
在catch中聲明的異常對象封裝了例外狀況事件發生的資訊,在catch語句塊中可以使用這個對象的一些方法擷取這些資訊
例如:
getMessage()方法,用來得到有關例外狀況事件的資訊
printStackTrace()方法,用來跟蹤例外狀況事件發生時執行堆棧的內容
Finally語句
Finally語句為異常處理提供一個統一的出口,使得在控制流程程轉到程式的其他部分以前,能夠對程式的狀態作統一的管理
無論try所指定的程式塊中是否拋出例外,finally所指定的代碼都要被執行
通常在finally語句中可以進行資源的清除工作 如:
關閉開啟的檔案
刪除臨時的檔案
Catch可以有0個或多個,且只有一個catch會被執行。finally只能有0個或1個!且必須寫在catch之後。
在一個try語句塊後面,基類異常的捕獲語句不可以寫在子類異常捕獲語句的上面
Java的異常處理機制使得例外狀況事件,沿著被調用的順序往前尋找,直到找到符合該種類的例外處理常式
注意:
重寫方法時需要拋出與原方法所拋出異常類型一致的異常或不拋出異常