1. 程式人生 > >Java中多個異常的捕獲順序(多個catch)

Java中多個異常的捕獲順序(多個catch)

原則 static exc bar 執行 cep oid 總結 ati

Java代碼
  1. import java.io.IOException;
  2. public class ExceptionTryCatchTest {
  3. public void doSomething() throws IOException{
  4. System.out.println("do somthing");
  5. }
  6. public static void main(String[] args){
  7. ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
  8. try {
  9. etct.doSomething();
  10. } catch (Exception e) {
  11. } catch (IOException e) {
  12. }
  13. }
  14. }


【問題】

上述程序能否編譯通過?為什麽?


【解答】

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

【總結】

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

https://blog.csdn.net/yasi_xi/article/details/23871867

Java中多個異常的捕獲順序(多個catch)