2

我正在回答一些基本的 Java 练习测试问题,而在参加测试时,以下问题的正确答案从我身边溜走了。

问题:“如果没有捕获到异常,finally 块将运行并跳过方法的其余部分 - TRUE 还是 FALSE?”

我试图用 ThrowTest 类(粘贴在底部)来证明答案,但我发现 Java 异常处理有点陌生。我按原样编译该类,并将 catch 块的 ArrayIndexOutOfBoundsException 部分注释掉。然后我在不传递输入参数的情况下执行该类,从而创建一个异常(ArrayIndexOutOfBoundsException 异常)。我希望最终的 System.out.println 不会执行,实际上它不会。

我发现如果我取消注释 ArrayIndexOutOfBoundsException 捕获块并重新编译,那么该类会在运行时捕获该特定错误并在底部执行“方法的其余部分”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!");
    }

}
4

2 回答 2

1

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

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

doOtherStuff();

doFinallyStuff将永远在这里执行。但doOtherStuff只会在以下条件下执行:

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

try如果在该块中抛出另一个未被该catch块处理的异常,doFinallyStuff仍然会执行,但doOtherStuff不会

于 2013-03-05T22:57:08.437 回答
0

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

于 2013-03-05T22:56:23.417 回答