程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> J2SE綜合:JAVA異常處理方式的區別和分析

J2SE綜合:JAVA異常處理方式的區別和分析

編輯:JAVA編程入門知識
一、內層方法拋出異常,外層方法捕捉並處理異常:
  
  public void methodA (){
     try{
         // 調用methodB
         methodB();
     }
     catch(ExceptionType et){
        // 相應處理措施
     }
  }
  
  public void methodB throws ExceptionType{
      if (condition is true)
      {
    // 相應處理措施
      }
   else
   {
    throw new ExceptionType(argument);
   }
  }
  
  在這個例子中,方法B的頭部中聲明了該方法會拋出一個類型為ExceptionType的異常,在方法體中使用throw子句拋出了一個異常,那麼該異常被誰捕捉到呢,答案是方法A。因為異常拋出後,JVM會順著該方法的調用棧一層一層的往上找。因為方法A中有一個catch(ExceptionType et),所以被拋出的異常會被捕捉到並處理。
  
  
  二、方法中自己捕捉,處理異常:
  
  public methodA() {
   try
   {
    // 可能產生異常的語句
   }
   catch (ExceptionType et)
   {
    // 相應的處理
   }
  }
  在這個例子中,方法A使用了try-catch語句塊,那麼意味著在方法中所產生的ExceptionType類型的異常都會被捕捉到並在方法內處理。
  
  
  三、內層方法拋出一個異常,但本身又有try-catch
  
  public methodB() throws ExceptionType{
   
   try
   {
    // 可能產生異常的語句
   }
   catch (AnotherExceptionType aet)
   {
    // 相應處理措施
   }
  }
  在這個例子中有兩種異常處理情況,拋出異常和捕捉異常,如果在try語句塊中產生ExceptionType類型的異常的話,會被拋出。如果產生AnotherExceptionType類型的話,則不會被拋出,因為在方法B的頭部中並沒有聲明會拋出該異常。
  
  
  四、內層方法拋出一個異常,但本身有try-finally
  
  public methodB() throws ExceptionType{
  
   try
   {
    // 可能產生異常的語句
   }
   finally
   {
    // 一定要執行的語句
   }
  }
  這個例子與上一個例子很像,不同的是沒有catch,但增加了finally。它的意思如果方法B中try語句塊中如果產生了異常,則拋出由外層方法處理。然後方法B繼續執行finally中的語句
  
  
  下面列舉三種錯誤的異常處理方法:
  
  一、內層方法拋出一個異常,但本身有捕捉這個異常
  
  public methodB() throws ExceptionType{
   
   try
   {
    // 可能產生異常的語句
   }
   catch (ExceptionType et)
   {
    // 相應處理措施
   }
  }
  在這個例子中,方法B在頭部聲明了會拋出一個類型為ExceptionType的異常,但在緊接下來的方法體又用了catch(ExceptionType et),如果產生了異常的話,會有什麼結果呢?方法B拋出的異常馬上被自身的catch捕捉到,所以方法頭部的throws實際是沒有作用的。外層方法是接收不到方法B拋出的異常對象的。
  
  
  二、在try中使用了return,在fianlly中又使用了return 
  
  public methodB() {
  
   try
   {
    // 可能產生異常的語句
    return SOMEVALUE;
   }
   catch ()
   {
   }
   finally
   {
    return SOMEVALUE_2;
   }
  
  }
  在這個例證中,我們可以看到在try中返回了SOMEVALUE,那麼程序執行到這裡是否就結束了呢,其實不是的,因為finally中的語句是肯定會被執行到的,所以最後返回的是SOMEVALUE_2;那麼意味者即使程序沒有拋出異常,最後也得不到正確的結果。
  
  
  三、把catch(Exception e)放在所有catch塊的最前面
  public methodB(){
   try
   {
    
   }
   catch (Exception e)
   {
    ...
   }
   catch (SubException se)
   {
    ...
   }
  
  }
  在這個例子中,catch(Exception e)被放在所有catch語句塊的最前面,因為Exception所有Exception類型的父類,所以意味著所有在try中產生的異常都會被捕捉到。後面其他的catch都是沒有用的,所以一定要把catch(Exception e)放在最後面,如果前面所有的異常類型都不符合,至少保證還有一個可以處理它。
  
   
  
  總結:
  A.如果能夠找到一個有意義的方法來捕獲異常,就立即引入這個方法
  B.否則就應該考慮做某些處理後傳遞或者再次拋出異常,也可以把異常轉換為另一種形式,然後拋出一個新的異常
  C.另一個方法是,可以完全忽略這個異常,而把它加到方法的頭部的throws語句中,由調用這個方法的方法來處理它
  D.通過捕獲一個公共的異常超類,可以在一個塊裡面捕獲多個異常,但不能夠用一個空的catch語句 塊來完全制止一個異常。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved