Java基礎:異常捕獲順序

 轉載請註明出處:jiq•欽's technical Blog 


public voidtestException(){
int a[] = {1,2,3};int q = 0;
try{
for(int i=0;i<a.length;i++){a[i] /= q;}
}catch(ArithmeticException h){
System.out.print("ArithmeticException\n");        //運行
}catch(Exception e){
System.out.print("Exception\n");        //不會運行。且必須放在ArithmeticException後面
/**
 * 範圍更大的Exception不但必須放在後面
 * 而且放在後面還不會被運行(被前面的範圍更小的
 * 異常攔截了),那這樣還有什意義呢???
 */
}finally{System.out.print("finally\n");}
}
//<span style="color:#3333ff;">output</span>
ArithmeticException
finally

 *         要點 1 儘管 ArithmeticException 繼承自 Exception 。但是當發生 ArithmeticException 異常

 *                        並捕獲的時候,就僅僅會捕獲實際發生的這個異常。並不會因爲Exception是其父類而java

 *                        運行Exception那個catch子句。post

 *        要點2但是假設你嘗試將範圍更大的Exceptioncatch語句放到的catch語句的前面,那麼就會發生spa

 *                        catch子句不可到達的錯誤「Unreachablecatch block for ArithmeticException..net

 *                        Itis already handled by the catch block for Exceptioncode

 *                        即範圍更大的異常(父類)必須放在後面,假設沒有繼承關係,比方ClassNotFoundExceptionblog

 *                        ArithmeticExceptioncatch子句之間就無所謂前後關係。繼承

相關文章
相關標籤/搜索