JAVA編程中異常問題處理方式的區(qū)別和分析

字號(hào):

一、內(nèi)層方法拋出異常,外層方法捕捉并處理異常:
    public void methodA (){
    try{
    // 調(diào)用methodB
    methodB();
    }
    catch(ExceptionType et){
    // 相應(yīng)處理措施
    }
    }
    public void methodB throws ExceptionType{
    if (condition is true)
    {
    // 相應(yīng)處理措施
    }
    else
    {
    throw new ExceptionType(argument);
    }
    }
    在這個(gè)例子中,方法B的頭部中聲明了該方法會(huì)拋出一個(gè)類型為ExceptionType的異常,在方法體中使用throw子句拋出了一個(gè)異常,那么該異常被誰捕捉到呢,答案是方法A。因?yàn)楫惓伋龊?,JVM會(huì)順著該方法的調(diào)用棧一層一層的往上找。因?yàn)榉椒ˋ中有一個(gè)catch(ExceptionType et),所以被拋出的異常會(huì)被捕捉到并處理。
    二、方法中自己捕捉,處理異常:
    public methodA() {
    try
    {
    // 可能產(chǎn)生異常的語句
    }
    catch (ExceptionType et)
    {
    // 相應(yīng)的處理
    }
    }
    在這個(gè)例子中,方法A使用了try-catch語句塊,那么意味著在方法中所產(chǎn)生的ExceptionType類型的異常都會(huì)被捕捉到并在方法內(nèi)處理。
    三、內(nèi)層方法拋出一個(gè)異常,但本身又有try-catch
    public methodB() throws ExceptionType{
    try
    {
    // 可能產(chǎn)生異常的語句
    }
    catch (AnotherExceptionType aet)
    {
    // 相應(yīng)處理措施
    }
    }
    在這個(gè)例子中有兩種異常處理情況,拋出異常和捕捉異常,如果在try語句塊中產(chǎn)生ExceptionType類型的異常的話,會(huì)被拋出。如果產(chǎn)生AnotherExceptionType類型的話,則不會(huì)被拋出,因?yàn)樵诜椒˙的頭部中并沒有聲明會(huì)拋出該異常。
    四、內(nèi)層方法拋出一個(gè)異常,但本身有try-finally
    public methodB() throws ExceptionType{
    try
    {
    // 可能產(chǎn)生異常的語句
    }
    finally
    {
    // 一定要執(zhí)行的語句
    }
    }
    這個(gè)例子與上一個(gè)例子很像,不同的是沒有catch,但增加了finally。它的意思如果方法B中try語句塊中如果產(chǎn)生了異常,則拋出由外層方法處理。然后方法B繼續(xù)執(zhí)行finally中的語句。