Java中有多個異常, 如何確定捕獲順序(多個catch),先從上到下執行,判斷異常的大小,如果包含捕到異常,就進入這個catch,后面的就不再執行


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

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 et = new ExceptionTryCatchTest();   
  8.         try {   
  9.             et.doSomething();   
  10.         } catch (Exception e) {   
  11.             //
  12.         } catch (IOException e) {   
  13.             //
  14.         }   
  15.     }  
  16. }  

問題:上述程序能否編譯通過?為什么?


解答:不能編譯通過。因為編譯的時候會報錯:已捕捉到異常 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匹配,由於OExceptionextends Exception,根據多態的原則,IOException是匹配Exception的,所以程序就會進入到catch (Exception e) {}里面,進入到第一個catch后,后面的catch都不會執行了,所以catch (IOException e) {}永遠都執行不到,就給我們報出了前面的錯誤:已捕捉到異常 java.io.IOException。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM