轉載於:https://blog.csdn.net/jiyiqinlovexx/article/details/46597899
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是其父類而
* 執行Exception那個catch子句。
* 要點2:但是如果你嘗試將範圍更大的Exception的catch語句放到的catch語句的前面,那麼就會發生
* catch子句不可到達的錯誤“Unreachablecatch block for ArithmeticException.
* Itis already handled by the catch block for Exception”
* 即範圍更大的異常(父類)必須放在後面,如果沒有繼承關係,比如ClassNotFoundException,
* 和ArithmeticException的catch子句之間就無所謂先後關係。