一、內層方法丟擲異常,外層方法捕捉並處理異常:
public void methoda ()
catch(exceptiontype et)
}public void methodb throws exceptiontype
else
}在這個例子中,方法b的頭部中宣告了該方法會丟擲乙個型別為exceptiontype的異常,在方法體中使用throw子句丟擲了乙個異常,那麼該異常被誰捕捉到呢,答案是方法a。因為異常丟擲後,jvm會順著該方法的呼叫棧一層一層的往上找。因為方法a中有乙個catch(exceptiontype et),所以被丟擲的異常會**捉到並處理。
二、方法中自己捕捉,處理異常:
public methoda()
catch (exceptiontype et)
}在這個例子中,方法a使用了try-catch語句塊,那麼意味著在方法中所產生的exceptiontype型別的異常都會**捉到並在方法內處理。
三、內層方法丟擲乙個異常,但本身又有try-catch
public methodb() throws exceptiontype
catch (anotherexceptiontype aet)
}在這個例子中有兩種異常處理情況,丟擲異常和捕捉異常,如果在try語句塊中產生exceptiontype型別的異常的話,會被丟擲。如果產生anotherexceptiontype型別的話,則不會被丟擲,因為在方法b的頭部中並沒有宣告會丟擲該異常。
四、內層方法丟擲乙個異常,但本身有try-finally
public methodb() throws exceptiontype
finally
}這個例子與上乙個例子很像,不同的是沒有catch,但增加了finally。它的意思如果方法b中try語句塊中如果產生了異常,則丟擲由外層方法處理。然後方法b繼續執行finally中的語句
下面列舉三種錯誤的異常處理方法:
一、內層方法丟擲乙個異常,但本身有捕捉這個異常
public methodb() throws exceptiontype
catch (exceptiontype et)
}在這個例子中,方法b在頭部宣告了會丟擲乙個型別為exceptiontype的異常,但在緊接下來的方法體又用了catch(exceptiontype et),如果產生了異常的話,會有什麼結果呢?方法b丟擲的異常馬上被自身的catch捕捉到,所以方法頭部的throws實際是沒有作用的。外層方法是接收不到方法b丟擲的異常物件的。
二、在try中使用了return,在fianlly中又使用了return
public methodb()
catch ()
finally
}在這個例證中,我們可以看到在try中返回了somevalue,那麼程式執行到這裡是否就結束了呢,其實不是的,因為finally中的語句是肯定會被執行到的,所以最後返回的是somevalue_2;那麼意味者即使程式沒有丟擲異常,最後也得不到正確的結果。
三、把catch(exception e)放在所有catch塊的最前面
public methodb()
catch (exception e)
catch (subexception se)
}在這個例子中,catch(exception e)被放在所有catch語句塊的最前面,因為exception所有exception型別的父類,所以意味著所有在try中產生的異常都會**捉到。後面其他的catch都是沒有用的,所以一定要把catch(exception e)放在最後面,如果前面所有的異常型別都不符合,至少保證還有乙個可以處理它。
總結:a.如果能夠找到乙個有意義的方法來捕獲異常,就立即引入這個方法
b.否則就應該考慮做某些處理後傳遞或者再次丟擲異常,也可以把異常轉換為另一種形式,然後丟擲乙個新的異常
c.另乙個方法是,可以完全忽略這個異常,而把它加到方法的頭部的throws語句中,由呼叫這個方法的方法來處理它
d.通過捕獲乙個公共的異常超類,可以在乙個塊裡面捕獲多個異常,但不能夠用乙個空的catch語句 塊來完全制止乙個異常。
JAVA異常處理方式的區別和分析
一 內層方法丟擲異常,外層方法捕捉並處理異常 public void methoda catch exceptiontype et public void methodb throws exceptiontype else 在這個例子中,方法b的頭部中宣告了該方法會丟擲乙個型別為exceptiont...
JAVA異常處理方式的區別和分析
一 內層方法丟擲異常,外層方法捕捉並處理異常 public void methoda catch exceptiontype et public void methodb throws exceptiontype else 在這個例子中,方法b的頭部中宣告了該方法會丟擲乙個型別為exceptiont...
JAVA程式設計中異常問題處理方式的區別和分析
一 內層方法丟擲異常,外層方法捕捉並處理異常 public void methoda catch exceptiontype et public void methodb throws exceptiontype else 在這個例子中,方法b的頭部中宣告了該方法會丟擲乙個型別為exceptiont...