繁体   English   中英

无法理解Finally Block的行为

[英]Unable to understand behaviour of Finally Block

我是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 */
    } 
}

您正在捕获异常(在catch块中)而不是重新抛出它 - 因此您正在有效地处理异常,然后执行就好像它没有被抛出一样。 该程序只退出,因为它到达main方法的末尾 - 它不像它突然终止。

如果你改变你的代码要么从catch块中重新抛出异常, 要么只是在第一个地方没有捕获它(这两个都需要你声明main抛出Exception ,当然)然后它不会打印D

没有任何东西可以导致程序退出。

catch块的重点是捕获异常并防止它进一步传播。
捕获异常后,继续执行。

finally块没有最终确定程序,它只是确保每次try catch块运行时执行,而有一个例外或不...

如果你在catch块中重新抛出异常,它将打印BC

catch (Exception ex) 
{
    System.out.print("B");  
    throw ex;
}

然后你必须声明你的主要

public static void main(String [] args) throws Exception

最后在try / catch块结束时调用。 即使尝试失败并执行catch,它也会被调用。 如果程序以某种方式被杀死(JVM死掉,被迫关闭等),则不会执行Finally块本身。

在您的示例中,D正在执行,因为它位于try / catch / finally {}块之外。

有上捕捉异常和的try / catch /终于行为一个很好的博客文章在这里

哪个是对的。 上面的代码会。

  1. 尝试执行badMethod并将失败
  2. catch执行代码
  3. finally执行代码
  4. 继续执行 - 打印出D

trycatch块运行后处理finally块(取决于是否抛出/捕获异常)。 如果异常都抓住了正确且由处理catch ,它会运行finally再继续运行该方法的其余部分。

您的程序以下列方式运行:1。调用抛出异常的错误方法2.捕获异常3.执行finally块4.恢复

在Java中,当抛出异常时,如果处理异常,则不一定结束程序执行。 您的程序实际上并不处理异常,但无论如何都会捕获它,这足以让JVM认为可以恢复执行。

输出BCD是非常正确的输出。

最后是java程序必须执行的块。 它允许当前正在运行的程序的所有已分配资源获得释放,并在需要时使其可用于其他应用程序。

这主要用于我们共享数据库或设备等公共资源时。

将finally块视为一个独立的代码块,您仍然希望您的方法继续执行,而不管是否发生异常。

所以在你的情况下, badMethod抛出一个异常,然后由catch块捕获,然后你的main继续独立执行finally块。

换句话说,如果badMethod决定不抛出异常,那么finally块仍然会在到达方法结束之前继续执行。

因此,如果最终成为一个独立的块,那么如果愿意的话,可以在主代码中执行类似的操作。

try
{
 fooA();
}
finally
{
 fooB();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM