Java異常
異常處理
異常是在程序執行過程中任何中斷正常程序流程的異常條件。Java異常是一個描述在代碼段中發生異常情況的對象,Java講異常抽象爲一系列的類,用來描述不同錯誤情況下的詳細信息。當一類異常情況發生時,一個表示該異常的對象被JVM創建,並在方法中拋出(throw),然後在方法內部,程序員可以自己選擇處理該異常,或者把異常直接拋出去,讓方法的調用者來處理此異常。
異常體系
Throwable
|---Erroe
|---Exception
|---RuntimeException
Java把異常當做對象來處理,並定義一個基類java.lang.Throwable作爲所有異常的超類。在Java API中,已經定義了許多異常類,這些異常類範圍兩大類,歸屬於Throwable:
錯誤(Erroe)和異常(Exception)。
Error類定義了在通常環境下不希望被程序捕獲的異常,表示系統錯誤比較嚴重無法恢復的情況。在Java中,運行時異常和Error異常又被稱爲不可控異常,及用戶程序都不需要去處理的異常。
Exception類定義了由應用程序拋出的異常,這些異常是可以被用戶程序捕獲的。Exception異常分爲:運行時異常(RuntimeException)和預期異常(CheckedException)。運行時異常是任何屬於RuntimeException的子類的異常,是程序運行中,由於程序的一些代碼存在缺陷(bug),導致程序終止,無法繼續運行。運行時異常通常無法恢復,所以程序不用處理此類異常,一般做法是在異常產生時,根據錯誤信息找到錯的程序代碼,然後進行代碼修復。預期異常是能被Java編譯器分析的異常,方法調用者通過代碼的檢測與處理,可以對其進行恢復。在Java異常體系中,預期異常是程序必須處理的,否則就會出現編譯錯誤。
異常處理語句
try{
需要被檢測的代碼
}catch{
處理異常的代碼
}finally{ //finally中定義的通常是關閉資源的代碼,
一定會執行的代碼 //finally只有一種情況不會被執行:System.exit(0)
}
try/catch/finally有三種結合方式:
1、try{
}catch{
}
2、try{
}finally{
}
3、try{
}catch{
}finally{
}
其中可以使用多個catch子句來處理一段代碼可能會引發的多個異常,但是應把父類異常放到最後。
Throw和throws的用法
Throw定義在方法體內,用於拋出異常對象,當方法中有throw拋出異常對象時,且並未進行try處理,則必須在方法聲明處使用throws關鍵字指明拋出的異常,否則編譯失敗。注意如果方法中出現的是RuntimeException異常,則不需要指明。
Throws定義在方法聲明處,用於拋出異常類,可以同時拋出多個,用逗號隔開
自定義異常
在Java異常類中,儘管定義了大多數常見錯誤,但有的時候,程序要建立自己的異常類型來處理特定的應用場景,這就需要程序自己定義一個新的異常。自定義異常類只需要繼承Exception類或它的一個子類,根據需要實現不同的構造方法就可以了。
Class MyException extends Exception{
MyException(Stringmessage){
Super(massage);
}
}
異常方法的覆蓋
Java繼承中,子類可以覆蓋父類的方法,如果父類方法拋出異常,那麼子類方法覆蓋父類方法時需要注意:
-
子類方法可以聲明拋出和父類相同的異常;
-
子類方法可以聲明拋出父類方法異常的子類;
-
子類方法可以不拋出任何異常,但必須使用try/catch處理異常
-
子類方法不能跑出其他異常