无法理解Finally Block的行为

时间:2012-04-17 13:57:15

标签: java exception-handling

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

10 个答案:

答案 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)

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

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

答案 6 :(得分:1)

finallytry块运行后处理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();
}