last finally子句总是会执行吗?

时间:2012-06-19 13:33:25

标签: java

try {
    if (myBoolean) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    code.to.cleanup();
}

我不完全确定,但是上面的代码片段我认为可能导致finally子句不执行,无论myBoolean的值是什么

5 个答案:

答案 0 :(得分:9)

不,System.exit(1)阻止finally子句运行。

基本上,在try / catch之后执行finally块,无论try还是catch是否正常或异常返回。

System.exit会阻止该块返回

(正如彼得所指出的那样,while(true) ;显然会无限期地阻止。只是假设while (true) ;是一个更有意义的东西:)

答案 1 :(得分:2)

因为如果 myBoolean 值为true,它将进入无限循环。我认为你在发表声明后放错了分号。

在第二种情况下,如果 myBoolean 为false, System.exit(1)会使程序退出而不运行任何进一步的语句。

答案 2 :(得分:0)

在您的示例中,finally将不会作为if块是无限循环中的代码执行,而在else块中它会导致JVM关闭。 但是对于任何其他正常情况,即使你在try块中有return关键字,也总是会执行。

try {
  System.out.println("Returning from here....");
  return;
} finally {
  System.out.println("Inside finally....");
}

输出将是:

Returning from here....
Inside finally....

答案 3 :(得分:0)

System.exit(1)执行应用程序的残酷退出,忽略调用堆栈上的任何内容,包括finally块。
请记住,GC也不会运行,因此应用程序使用的资源可能会处于“挂起”或“僵尸”状态(未关闭的文件等等)。 如果这只是为了理论而提出的问题,请忽略我的评论。

答案 4 :(得分:0)

请注意,因为其他人已经很好地回答了这些细节:finally本质上是一种保证,如果执行离开try,之前不会运行其他代码运行finally块。它不保证finally阻止 运行。后者是不可能的;在极端情况下考虑停电或硬件故障。

finally旨在使您能够在执行离开try / finally块后向程序的其余部分提供有关事物状态的保证。 finally并非旨在为您的计划之外的世界提供保证。如果“你的程序的其余部分”没有继续运行,操作系统的责任就是在已经发布的资源方面清理死亡进程后,以及其他系统与你的程序交互的责任有办法处理你的过程突然失败。