try {
if (myBoolean) {
while (true) ;
} else {
System.exit(1);
}
} finally {
code.to.cleanup();
}
我不完全确定,但是上面的代码片段我认为可能导致finally子句不执行,无论myBoolean的值是什么
答案 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
并非旨在为您的计划之外的世界提供保证。如果“你的程序的其余部分”没有继续运行,操作系统的责任就是在已经发布的资源方面清理死亡进程后,以及其他系统与你的程序交互的责任有办法处理你的过程突然失败。