在Java等面向對象的編程語言中,異常自己是一個類
產生異常就是建立異常對象並拋出了一個異常對象。
Java中處理方式爲中斷處理java
異常的產生過程:面試
java處理異常的五個關鍵字:try, catch, finally, throw, throws編程
做用:編程語言
使用throw關鍵字在指定的方法中拋出指定的異常
使用格式:ui
throw new xxxException("異常產生的緣由");
注意:
1.throw關鍵字必須寫在方法的內部
2.throw關鍵字後邊new的對象必須是Exception或者Exception的子類
3.throw關鍵字拋出指定的異常對象,就必須處理這個異常對象spa
throw關鍵字後邊建立的是RuntimeException或者RuntimeException的子類對象,咱們能夠不處理,默認交給JVM處理 throw關鍵字後邊建立的是編譯異常,咱們就必須處理這個異常,要麼throws,要麼try...catch...
做用:
當方法內部拋出異常對象的時候,那麼咱們就必須處理這個異常對象,
可使用throws關鍵字處理異常對象,把鍋拋給JVM處理 --> 中斷處理3d
使用格式:日誌
修飾符 返回值類型 方法名(參數列表) throws AAAException{ throw new AAAException("產生緣由"); }
注意:code
1.throws必須寫在方法聲明處2.throws後面聲明的異常必須是Exception或者Exception的子類對象
3.方法內部若是拋出多個異常,throws後面也必須聲明多個異常,
若是拋出的多個異常對象有父子類關係,直接聲明父類4.調用了一個聲明異常的方法,就必須處理聲明異常,
要麼繼續使用throws聲明拋出,最終交給JVM
要麼try...catch...本身處理異常
格式:
try { 可能產生異常的代碼 }catch(定義異常的變量,用來接收try中拋出的異常對象) { 異常的處理邏輯,以後是如何處理異常對象 通常工做中,會把異常的信息記錄到一個日誌中 } ... catch(異常類名 變量名) { }
注意:
1.能夠拋出多個異常對象,可使用多個catch
2.try中產生異常,執行catch,以後繼續執行try...catch以後的代碼
若是try中沒有產生異常,就不會進入catch,執行完try直接執行後續代碼
try...catch與throw的區別:
try...catch能夠執行後續程序
throw則是中斷程序
必定要執行的代碼
不管異常發生不發生,都須要執行
並且出現程序跳轉,部分代碼會執行不到
格式:
try{ ... }catch() { ... } ... catch() { }finally { //不管是否異常均會執行的代碼 }
注意:
1.finally必須和try一塊兒使用
2.finally通常用於資源釋放,程序最後均要資源釋放
還能夠執行後續代碼
catch裏邊定義的異常變量,若是有父子類關係,那麼子類的異常變量必須寫在上邊,不然報錯(與多態知識相關)
對於try裏面發生的異常,他會根據發生的異常和catch裏面的進行匹配(怎麼匹配,按照catch塊從上往下匹配),
當它匹配某一個catch塊的時候,他就直接進入到這個catch塊裏面去了,後面在再有catch塊的話,它不作任何處理,直接跳過去,所有忽略掉。
catch中定義的變量能夠接收try中的全部異常對象。
運行時異常被拋能夠不捕獲也不處理,給JVM(中斷程序)
有return語句的話,永遠返回finally中的結果
public static int demo4() { int i = 0; try { return i; } finally { i = 12; System.out.println("finally trumps return."); return i; } } //輸出結果 finally trumps return. 12
①若是父類拋出多個異常,子類重寫父類方法時,拋出
和父類相同的異常
或者父類異常的子類
或者不拋出異常
②父類方法沒有拋出異常,子類重寫時也不能夠拋出異常,只能捕獲處理,不能聲明拋出
(父類異常什麼樣,子類異常就什麼樣)
public static int demo5() { try { return printX(); } finally { System.out.println("finally trumps return... sort of"); } } public static int printX() { System.out.println("X"); return 0; } //輸出結果 X finally trumps return... sort of 0