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

我不完全确定,但我觉得上面的代码片段可能会导致 finally 子句不执行,无论 myBoolean 的值如何

4

5 回答 5

9

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

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

然而,A完全System.exit阻止了块返回

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

于 2012-06-19T13:34:15.780 回答
2

因为如果myBoolean值为 true,就会进入无限循环。我认为您在 while 语句后放错了分号。

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

于 2012-06-19T13:35:42.237 回答
0

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

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

于 2012-06-20T07:26:01.940 回答
0

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

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

输出将是:

从这里归来......
终于进去了……
于 2012-06-19T13:50:22.220 回答
0

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

于 2012-06-19T13:52:06.143 回答