一、異常的理解及體系結構圖
1、理解
異常:程序運行過程中發生的不正常現象。
java中的錯誤:
語法錯誤
運行異常
邏輯錯誤
2、體系圖
java程序在執行過程中所發生的異常分為兩類:
Error:Java虛擬機無法解決的嚴重問題。如JVM系統內部錯誤、資源耗盡等嚴重情況(StackOverflowError、OOM),一般不編寫針對性的代碼進行處理
Exception:其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理。一般有兩種解決方法:一是遇到錯誤就終止程序的運行。另一種方法是由程序員在編寫程序時,就考慮到錯誤的檢測、錯誤消息的提示,以及錯誤的處理。
常見的異常可分為兩類:運行時異常和編譯時異常。異常體系圖如下,其中紅色部分為受檢異常,藍色部分為非受檢異常。
二、異常處理的方式
1、抓模型
(1)語法
try{
①
//容易出現異常的代碼
②
}catch(異常類型 e){
//處理異常的語句
③
}finally{
//最后一定要執行的語句
④
}
⑤
執行順序 ★
如果出現了異常: ①③④一定執行,⑤不一定。如果異常被成功捕獲,而且沒有其他跳轉,⑤會執行,否則⑤不執行
如果沒有出現異常:①②④一定執行, ⑤不一定。如果沒有其他跳轉,⑤會執行,否則⑤不執行
(2)好處
①提高了用戶體驗性
②將正常代碼和容易出錯的代碼實現了分離,提高了代碼的閱讀性和維護性
③如果成功捕獲異常,則起到了攔截異常的作用,異常后面的語句會正常執行
(3)注意事項
①catch塊可以省略
②finally塊可以省略
③盡量使用多個catch塊,代替多個try catch
④不能濫用異常
⑤catch塊可以有多個,但如果catch塊的異常類型為父類類型,需要將該catch塊放在最后
2、拋模型(默認異常處理方式)
(1)語法
修飾符 返回類型 方法名(參數列表) throws 異常類型XX{
}
注意:異常類型XX為方法中容易出現的異常的類型或父類類型
(2)執行特點
將異常拋給調用方,如果調用方不處理,則繼續往上拋,直到拋給jvm。而jvm使用的是默認的處理方式。e.printStackTrace()
三、自定義異常
1、語法
class XXException extends Exception或RuntimeException{
public XXException(){}
public XXException(String msg){super(msg);}
}
2、如何使用自定義異常
在需要生成異常對象的地方,添加如下語句:
throw new XXException(異常信息);
四、常見問題解答
1、生成異常對象的方式
2種方式:
方式一:系統自動生成異常對象
針對于:系統定義好的異常類
方式二:手動生成異常對象
針對于:系統定義好的異常類和自定義的異常類
語法:throw new 異常類型(實參);
2、子類重寫父類方法的異常說明
子類重寫的方法拋出的異常類型可以相同或為子類類型
class Father{
public void run() throws Exception{}
}
class Son extends Father{
public void run() throws Exception{}
}
class Daughter extends Father{
public void run() throws IOException{}
}
3、throws和throw對比
? | 說明 | 放的位置 | 后面跟的東西 |
throws | 異常處理的方式 | 方法聲明的地方 | 異常類型 public void method throws XXXException{} |
throw | 生成異常對象的關鍵字 | 方法體中 | 異常對象 throw new XXXException(msg) |