1. 程式人生 > >Java基礎 -- 異常Exception

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預設異常處理機制,就是打印出異常的堆疊追蹤資訊並停止程式。