在try\finally块中,是否存在finally不会被执行的情况?

13

我正在学习面向对象编程的考试,我想知道是否有任何情况需要考虑以下代码:

try {
    do something
} catch (someException e) {

} finally {
    do something
}

finally代码块不会被执行吗?


13
拔掉插头就可以了。 - PreciousBodilyFluids
5
http://thedailywtf.com/Articles/My-Tales.aspx - Michael Myers
4个回答

17

是的。如果您通过本地代码崩溃Java虚拟机或以其他方式搞砸了程序,导致程序终止,或在try块内无限循环/等待。

这些是唯一避免执行finally块的三种情况。


3
调用 System.exit 或关闭计算机可能被视为“导致程序终止”... :-) - Rasmus Kaj
如果在try块中从包含此try/catch/finally短语的函数返回,finally块是否仍会执行? - euphoria83
2
@euphoriaпјҡжҳҜзҡ„пјҢеҪ“зӣёеә”зҡ„tryеқ—дёӯзҡ„д»Јз ҒеңЁжӯЈеёёжғ…еҶөдёӢйҖҖеҮәпјҲеҢ…жӢ¬жӯЈеёёејӮеёёпјүж—¶пјҢfinallyеқ—зҡ„жү§иЎҢжҳҜжңүдҝқйҡңзҡ„пјҢиҝҷжҳҜеҚҸи®®зҡ„дёҖйғЁеҲҶгҖӮ - Jason S
吹毛求疵:如果在 finally 之前执行了 catch 块,并且存在无限循环/等待,那么也会阻止执行到达 finally 块。除此以外,我认为您已经考虑到了所有情况 :-) - meriton

5
如果您在try块中调用System.exit(0),或者执行某些使JVM退出或挂起(如死锁)的操作,那么会发生。否则不会。

2
Java语言规范保证finally在try语句完成之前被调用。
通常情况下,try语句可能由于Borealid的回答中列举的原因而无法完成。

1
"finally在try语句完成之前被调用" ??? "before"难道不应该是"when"吗? - Jason S
2
try 块由 try 块、任何 catch 块和可选的 finally 块组成。 - meriton

0

如果控制流程从try或catch块中退出,finally块将绝对被执行。如果你以某种方式阻止控制流程从这些块中退出:

  • 通过编写exit语句,或者

  • 无限循环等。

那么finally块将不会被执行。 通常我们编写finally块是为了"清理"目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接