我正在回答一些基本的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!");
}
}
答案 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块将始终执行。