Java基礎 -- 異常Exception
異常層次結構:
編譯(checked)異常:指的是,程式碼在編譯的時候,JVM就檢查程式碼的正確性,從而丟擲編譯時就已能發現的異常
執行(unchecked)異常:指的是,程式碼在執行的過程中有可能丟擲的異常,我們自定義異常時都是繼承RuntimeException
自定義異常類:
都是繼承RuntimeException的。之所以自定義業務異常,完全是為了起一個業務名字的異常類,拋開這一點,我們的程式中其實沒必要自定義異常類的,就在程式碼有可能丟擲異常的地方 new RuntimeException("我的業務異常描述資訊");足夠用!
通過以上圖的示例會發現,當我們自己編寫程式時,需要某種業務不合理時,就丟擲異常,我們自定義的異常都是繼承RuntimeException的,小示例:
public class A { /** * 方法內部:當發現某種業務不符合我們的預期時,不捕獲異常,手動丟擲異常 */ public static void a(){ throw new RuntimeException("a()方法內部:throw new RuntimeException!"); } /** * 方法內部:當發現某種業務不符合我們的預期時,捕獲異常後可以再次丟擲它 */ public static void b(){ try{ int x= 1/0; }catch(Exception e){ e.printStackTrace(); throw new RuntimeException("zero 0"); } } /** * 方法宣告:執行時unchecked異常是可以不用捕獲,不用宣告的 */ //public static void c() throws ArithmeticException { public static void c() { int x= 1/0; //此句導致異常java.lang.ArithmeticException } /** * 方法宣告:編譯checked異常,如果方法體內沒捕獲,必須在宣告方法時throws */ public static void d() throws ClassNotFoundException{ Class.forName("ddd"); } public static void main(String[] args) { //a(); //b(); //c(); try{ d(); } catch(Exception e){} } }
異常執行機制:
異常概念:
Error:執行時系統錯誤,程式無法管,JVM虛擬機器的事
Exception:自定義異常都是繼承RuntimeException的,程式可以捕獲和處理異常
try{}塊:try塊內有可能丟擲異常,try內的return;是指退出try塊
catch(Exception e){}塊:捕獲異常加以處理,可再次丟擲異常,catch內的return;是指退出try塊
finally{}塊:一定會被執行的,finally內的return;是指從當前方法返回
鏈式異常:
鏈式異常:引起當前異常的背後異常
初始化:Throwable(String msg, Throwable causeExcp) //構造異常,背後異常是causeExcp
獲取背後異常:getCause() //如果當前異常有背後異常就返回,沒有背後異常就返回null
設定背後異常:initCause(Throwable causeExcp) //設定當前異常的背後異常為causeExcp
異常新特性:
JDK7新增異常特性:
資源自動釋放:try(資源){}catch(E e){}
多重捕獲:catch(MyExceptionx | MyExceptiony e){}
異常傳遞:
如果異常沒捕獲,則異常傳至上層呼叫方法直至JVM虛擬機器。JVM預設異常處理機制,就是打印出異常的堆疊追蹤資訊並停止程式。