我是Java语言的新手,无法理解此程序中finally块的行为。该程序应在打印BC后退出,而它正在打印BCD。请帮忙。
class Main
{
public static void main(String [] args)
{
try
{
badMethod();
System.out.print("A");
}
catch (Exception ex)
{
System.out.print("B");
}
finally
{
System.out.print("C");
}
System.out.print("D");
}
public static void badMethod() throws Exception
{
throw new Exception(); /* Line 22 */
}
}
答案 0 :(得分:8)
你正在捕获异常(在catch块中)而不是重新抛出它 - 所以你有效地处理异常,然后执行就好像它没有被抛出一样。程序只会退出,因为它到达main
方法的末尾 - 它不会像它突然终止一样。
如果您将代码更改为 从catch块或重新抛出异常,请不要首先捕获它(这两个都需要您当然声明main
抛出Exception
,然后就不会打印D
。
答案 1 :(得分:4)
没有任何东西可以让程序退出。
catch
块的重点是捕获异常并阻止它进一步传播。
捕获异常后,继续执行。
答案 2 :(得分:4)
finally
块没有最终确定程序,它只是确保每次运行try catch块时执行,而有一个例外或者没有...
答案 3 :(得分:1)
如果您在BC
块中重新抛出异常,它将打印catch
。
catch (Exception ex)
{
System.out.print("B");
throw ex;
}
然后你必须将你的主要声明为
public static void main(String [] args) throws Exception
答案 4 :(得分:1)
最后在try / catch块结束时调用。即使尝试失败并执行catch,它也会被调用。如果程序以某种方式被杀死(JVM死掉,被迫关闭等),Finally
块本身就不会被执行。
在您的示例中,D正在执行,因为它位于try / catch / finally {}块之外。
有关于捕获异常和try / catch / finally行为here的精彩博文。
答案 5 :(得分:1)
哪个是对的。上面的代码将会。
badMethod
并将失败catch
finally
答案 6 :(得分:1)
在finally
或try
块运行后处理catch
块(取决于是否抛出/捕获异常)。如果所有异常都被catch
正确捕获并处理,它将运行finally
,然后继续运行该方法的其余部分。
答案 7 :(得分:1)
您的程序以下列方式运行: 1.调用抛出异常的错误方法 2.抓住例外 3.执行finally块 4.继续
在Java中,当抛出异常时,如果处理异常,则不一定结束程序执行。你的程序实际上并没有处理异常,但仍然可以捕获它,这足以让JVM认为可以恢复执行。
输出BCD是非常正确的输出。
答案 8 :(得分:1)
最后是java程序的必需可执行块。 它允许当前正在运行的程序的所有已分配资源获得释放,并在需要时使其可用于其他应用程序。
这主要用于我们共享数据库或设备等公共资源时。
答案 9 :(得分:1)
将finally块视为一个独立的代码块,无论是否发生异常,您仍然希望您的方法继续执行。
所以在你的情况下,badMethod
抛出一个异常,然后由catch块捕获,然后你的main继续独立执行finally块。
换句话说,如果badMethod
决定不抛出异常,那么finally块在到达方法结束之前仍会继续执行。
因此,如果最终成为一个独立的块,则可以在主代码中执行类似的操作。
try
{
fooA();
}
finally
{
fooB();
}