Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法理解Finally块的行为_Java_Exception Handling - Fatal编程技术网

Java 无法理解Finally块的行为

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

我不熟悉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
块中重新抛出异常,它将打印
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
  • 最后执行
    中的代码
  • 继续执行-打印D

  • 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();
    }
    

    你为什么希望它退出?