Java中由try…catch語法來處理"異常",將關聯有"異常類"的方法包含在try{}程序塊中,catch(){}關鍵字可以使用形參,用于和方法產生的"異常"對象結合。當調用某個方法時,引起異常事件發生的條件成立,便會拋出"異常",原來的程序流程將會在此方法處中斷,然后try模塊后緊跟的catch中的"形參"和此異常對象完成了結合,繼而進入了catch模塊中運行。具體過程舉例說明:
例2:
/*將關聯有異常的方法包含在try模塊中*/
int myMethod(int dt){
int data = 0;
try{
int data = isLegal(dt);
}catch(LowZeroException e){
System.out.println("發生數據錯誤!");
}
return data;
}
三、"異常"的處理方法
有兩種方法處理"異常":第一種如例2,將含有"異常"出口的方法直接放到try塊中,然后由緊隨其后的catch塊捕捉。第二種是不直接監聽捕捉被引用方法的"異常",而是將這個"異常"關聯傳遞給引用方法,同時監聽捕捉工作也相應向上傳遞。
例3:
int myMethod2(int dt)
{
int data = 0;
try{
data = myMethod(dt)
}catch(LowZeroException e){
System.out.println("發生數據錯誤!");
e.printStackTrace();
}
return data;
}
int myMethod(int dt) throws LowZeroException
{
int data = isLegal(dt); //此處引用isLegal()方法,但并沒有捕捉它的"異常"
return data;
}
從上例中可以看到方法myMethod()與它引用的方法isLegal()產生的"異常"LowZeroException建立了關聯,也就是完成了將"異常"關聯的向上傳遞,此時的myMethod()方法體中雖然只有一個return返回語句,但它事實上同樣有兩種方式的函數出口,一種是由return返回的整形值,另一種則是返回方法名中的throws關鍵字所指的"異常類"的實例對象。相應的,監聽捕捉的工作交給了上一層方法myMethod2()。同樣的道理,myMethod2()也可以將"異常"通過throws的關聯繼續向上傳遞。這樣的話,一旦一個"異常"被捕捉到時,這個"異常"必有一個傳遞路徑,而如果我們在捕捉點的catch程序塊中加入printStackTrace()方法,便能清楚的看到這個"異常"是怎樣傳遞過來的。例如在例3如果有"異常"被捕捉到,e.printStackTrace()打印出來的結果將是:
LowZeroException:
at Example.isLegal
at Example myMethod
at Example.myMethod2
at Example main
從上結果中我們可以看到,從LowZeroException"異常"產生點,即包含throw new LowZeroException();子句的方法開始,然后一直追溯到產生當前線程的方法(注意:printStackTrace()并不是追溯到捕捉點結束,而是到產生當前線程的方法結束)。"異常"產生點產生的LowZeroException"異常"對象,首先被賦給了isLegal()關聯的LowZeroException類的無名引用,然后繼續賦給myMethod()關聯的LowZeroException類的無名引用,再繼續賦給myMethod2()中的catch塊中的形參e,最后在這里被處理掉,這個"異常"對象隨即消失?梢哉f,catch(){}就是"異常"對象的生命終結點。
另外還要注意一點,方法與"異常"的關聯可以一直向上傳遞,當傳遞到與main方法關聯后,即在main()方法的定義中使用了throws Exception,這時除了虛擬機沒有其它方法能夠引用main()方法,且在程序中可能看不到try…catch程序塊,但并不會產生錯誤,因為此時虛擬機會捕捉"異常",并且會默認的調用printStackTrace()方法打印出"異常"路徑?傊灰粋方法關聯了"異常",可以將這個"異常"關聯向上傳遞,但是最終必須使用catch來終止"異常",或者一直傳遞到main()方法交給Java虛擬機來結束"異常"對象的生命,否則是通不過編譯的。
四、使用"異常機制"的需要注意的幾點
1.一個方法中可能會產生多種不同的異常,你可以設置多個"異常"拋出點來解決這個問題。
2."異常"對象從產生點產生后,到被捕捉后終止生命的全過程中,實際上是一個傳值過程,所以你可以根據需要,來合理的控制檢測到"異常"的粒度。例如在例3中,如果你并不需要知道具體產生的是LowZeroException"異常",那么你可以使用"異常"的公共父類Exception來結合"異常"對象,即catch(Exception e){…}。同樣在"異常"與方法關聯的傳遞過程中,也可以根據需要控制關聯"異常"的粒度,即throws后面跟上異常對象的父類名。
3."異常機制"中還有一種特殊情況――RuntimeException"異常類"(見圖1),這個"異常類"和它的所有子類都有一個特性,就是"異常"對象一產生就被Java虛擬機直接處理掉,即在方法中出現throw 子句的地方便被虛擬機捕捉了。因此凡是拋出這種"運行時異常"的方法在被引用時,不需要有try…catch語句來處理"異常"。
文章來源于領測軟件測試網 http://www.kjueaiud.com/