Java 无法理解Finally块的行为
我不熟悉Java语言,无法理解这个程序中finally块的行为。此程序应在打印BC后退出,而它正在打印BCD。请帮忙Java 无法理解Finally块的行为,java,exception-handling,Java,Exception Handling,我不熟悉Java语言,无法理解这个程序中finally块的行为。此程序应在打印BC后退出,而它正在打印BCD。请帮忙 class Main { public static void main(String [] args) { try { badMethod(); System.out.print("A"); } catch (Exception e
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 */
}
}
如果在
catch
块中重新抛出异常,它将打印BC
catch (Exception ex)
{
System.out.print("B");
throw ex;
}
那么你就必须把你的主要任务声明为
public static void main(String [] args) throws Exception
您正在捕获异常(在catch块中),而不是重新触发它——因此您正在有效地处理异常,然后执行就好像它没有被抛出一样。程序退出只是因为它到达了
main
方法的末尾-它不像是突然终止的
如果您将代码更改为从catch块重新抛出异常,或者只是不首先捕获它(当然,这两种情况都需要您声明
main
抛出exception
),那么它将不会打印D
,不会导致程序退出
catch
块的全部目的是捕获异常并防止其进一步传播。捕获异常后,继续执行。最后在try/catch块末尾调用。即使尝试失败并执行捕获,也会调用它。只有当程序以某种方式被终止时(JVM终止、被迫关闭等),才会执行
Finally
块本身
在您的示例中,执行D是因为它在try/catch/finally{}块之外
关于捕获异常和try/catch/finally行为,有一篇很好的博客文章。这是正确的。以上代码将被删除
badMethod
将失败catch
中的代码
finally
块在try
或catch
块运行后处理(取决于是否引发/捕获异常)。如果异常都被正确捕获并由catch
处理,它将运行finally
,然后继续运行方法的其余部分。finally块不会完成程序,它只需确保在每次运行try-catch块时执行,而不管是否存在异常。您的程序以以下方式运行:
1.调用引发异常的错误方法
2.抓住例外
3.执行finally块
4.恢复
在Java中,当抛出异常时,如果处理了异常,则不一定结束程序执行。您的程序实际上并不处理异常,但无论如何都会捕获它,这足以让JVM认为可以继续执行
输出BCD是非常正确的输出。最后是java程序必须执行的块。 它允许当前正在运行的程序的所有分配资源免费使用,并在需要时提供给其他应用程序
这主要用于共享数据库或设备等公共资源。将finally块视为一个独立的代码块,无论是否发生异常,您仍然希望您的方法继续执行 因此,在您的例子中,
badMethod
抛出一个异常,该异常因此被catch块捕获,然后您的main继续独立执行finally块
换句话说,如果badMethod
决定不抛出异常,那么finally块仍将在到达方法末尾之前继续执行
因此,如果最终是一个独立的块,那么如果愿意,也可以在主代码中执行类似的操作
try
{
fooA();
}
finally
{
fooB();
}
你为什么希望它退出?