多個catch捕獲異常順序

寫出程序結果
```

class Exc0 extends Exception{}
class Exc1 extends Exc0{}


class Demo
{
public static void main(String[] args)
{
try
{
throw new Exc1();

catch(Exception e) 
{
System.out.println("Exception");
}
catch(Exc0 e)
{
System.out.println("Exc0");
}
}
}

```
解答:不能編譯通過。因爲編譯的時候會報錯:已捕捉到異常 Exc1。  
分析:對於try..catch捕獲異常的形式來說,對於異常的捕獲,可以有多個catch。對於try裏面發生的異常,他會根據發生的異常和catch裏面的進行匹配(怎麼匹配,按照catch塊從上往下匹配),當它匹配某一個catch塊的時候,他就直接進入到這個catch塊裏面去了,後面在再有catch塊的話,它不做任何處理,直接跳過去,全部忽略掉。如果有finally的話進入到finally裏面繼續執行。換句話說,如果有匹配的catch,它就會忽略掉這個catch後面所有的catch。對我們這個方法來說,拋出的是Exc0,當執行throw new Exc1();時,以及拋出了Exc1()異常,一但拋出Exc1()異常,它首先進入到catch (Exception e) {}裏面,先和Exception匹配,由於class Exc0 extends Exception{},根據多態的原則,Exc0 是匹配Exception的,所以程序就會進入到catch (Exception e) {}裏面,進入到第一個catch後,後面的catch都不會執行了,所以catch (Exc0 e) {}永遠都執行不到,就給我們報出了前面的錯誤:已捕捉到異常 Exc0 ;

總結:在寫異常處理的時候,一定要把異常範圍小的放在前面,範圍大的放在後面,Exception這個異常的根類一定要剛在最後一個catch裏面,如果放在前面或者中間,任何異常都會和Exception匹配的,就會報已捕獲到...異常的錯誤。

 

很多年前的文章了,回頭來看看再補充一點,try catch只能捕獲統一線程中的異常,如果try catch整個線程,線程中發生崩潰是catch不住的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章