未处理的Java异常执行方法的剩余部分?

时间:2013-03-05 22:49:56

标签: java exception-handling

我正在回答一些基本的Java练习测试问题,并且在参加测试时,我对下一个问题的正确答案已经过了。

问题:“如果未捕获异常,则会运行finally块并跳过方法的其余部分 - TRUE或FALSE?”

我试图用ThrowTest类(粘贴在底部)证明答案,但我发现Java异常处理有点不熟悉。我按照注释掉的catch块的ArrayIndexOutOfBoundsException部分编译该类。然后我执行该类而不传递输入parm,从而创建一个异常(ArrayIndexOutOfBoundsException异常)。我希望最终的System.out.println不会执行,事实上它也不会执行。

我发现如果我取消注释ArrayIndexOutOfBoundsException catch块并重新编译,那么该类会在运行时捕获该特定错误并执行底部的“其余方法”println。那么,我的代码是否证明其余的“方法的其余部分被跳过”或者我是否必须从主方法以外的方法测试它?也许有一种更直接的测试方法。

public class ThrowTest 
{

    public static void main(String[] args)
    {
    try
        {
            String anyString = args[0];
            System.out.println("Try  code executes");
        }

    catch(SecurityException e)  //any old exception
        {
            System.err.println ("Error: SecurityException. ");
            e.printStackTrace();
        }

    /* begin comment
    catch(ArrayIndexOutOfBoundsException e)
        {
            System.err.println("Error: Caught ArrayIndexOutOfBoundsException. ");
            e.printStackTrace();    
        }
    end comment */

    finally
        {
            System.out.println("finally block executes!");  
        }

        System.out.println("Rest of method executes!");
    }

}

2 个答案:

答案 0 :(得分:1)

无论抛出什么异常,finally块总是会执行(除非内存不足等任何奇怪的情况),所以给出以下内容

try {
  // do some code
}
catch (SomeException e) {
  // exception handling
}
finally {
  doFinallyStuff();
}

doOtherStuff();

doFinallyStuff将始终在此处执行。但doOtherStuff只会在以下条件下执行:

  • 不会抛出异常
  • 抛出
  • SomeException并且catch块不会重新抛出链上的异常

如果try块中未处理catch块未处理的另一个异常,doFinallyStuff仍将执行,但doOtherStuff将不会

答案 1 :(得分:0)

您的代码确实证明了一切都如您所描述的那样有效。当您捕获异常时,此后将执行该方法的其余部分。如果让方法抛出异常,它的执行会立即停止。无论哪种方式,finally块将始终执行。