2013-07-02 83 views
4

當try或catch塊中斷時finally塊不執行什麼時候執行finally塊?該文檔說「如果執行try或catch代碼的線程被中斷或終止,即使應用程序整體繼續,finally塊也可能不會執行。」有人可以舉個例子說明這種情況嗎?try或catch塊中斷時finally塊不執行

+0

那麼,有什麼問題嗎? – Caveman42

+0

@RAS是的,並在[最終總是執行在Java?](http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java),我找到了我想知道的。但是,我的意思是不同於這個問題。但是,答案確實存在。 – andy

回答

8

可以找到很好的答案here

除了System.exit(),如果JVM因某種原因崩潰(例如try塊中的死循環),finally塊將不會運行。

至於線程本身,僅當它正在使用的stop()方法(或不suspend()resume())將finally塊不執行停止。對interrupt()的調用仍將導致finally塊正在執行。

另外值得一提的是,由於在finally塊中的任何return聲明將覆蓋任何回報或異常的try/catch塊拋出,程序行爲很快就會變得不穩定,難以調試,如果這發生在你身上。沒有什麼值得采取防範措施的(因爲它只發生在極其罕見的情況下),但值得注意,以便在發生時能夠識別它。

+0

感謝您的回答,但是我真正想要查找的是在句子中被中斷的含義**如果執行try或catch代碼的線程被中斷或終止,finally塊可能無法執行,即使應用程序整體繼續**。這意味着停止**停止()**或**暫停()**。就像在你的回答中一樣,對** interrupt()**的調用並不能阻止** finally **被執行。 – andy

+0

是[this](http://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt-do)你在找什麼? –

+0

是的,非常感謝。 – andy

7

使finally不執行的唯一合法途徑是調用System.exitRuntime.halttrycatch

1

突然結束該應用程序之前,例如

System.exit(); 

即使在finally塊(例如,在塊try)的返回將在finally之後執行。

1

這是指(大部分)正常Java執行範圍外的事情。

  • 如果你的線程(成功)調用在try塊或catchSystem.exit(),該呼叫在JLS使用的感覺不會「終結」。同樣的事情發生,如果另一個線程調用System.exit()。在這種情況下,JVM 只是運行關閉掛鉤。

  • 如果JVM(硬盤)崩潰,所有Java活動立即停止。

  • 如果操作系統(硬)殺死了JVM進程,所有Java活動立即停止。

  • 如果電源CPU芯片熄滅......