天天看點

原創:異常處理方式的差別和分析

                               異常處理的方式差別和分析

一、内層方法抛出異常,外層方法捕捉并處理異常:

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語句 塊來完全制止一個異常。