2011-06-08 28 views
2

我不明白當GC從內存中回收一個對象時忽略了異常。方法完成和異常

如果我有一個try/catch進入一個finalize方法,我看它總是被執行......所以哪些情況下不會引發異常呢?

謝謝。

+5

一些示例代碼會與這個問題一起幫助... – 2011-06-08 08:49:14

+0

被忽略的異常是那些被拋出*方法finalize()的異常。如果你在該方法中有try/catch,那麼異常不會超出該方法,GC根本看不到這個。 – ignis 2011-06-08 09:08:02

回答

2

這意味着從finalize方法拋出的任何異常都會被忽略。但是,它內部的異常仍然照常工作。

4

finalize方法由終結器線程運行。如果拋出異常,終結器會忽略它(吞下它)。否則,終結器線程將會死亡。 這適用於引發且未被您的代碼捕獲的異常(在finalize()之內)。如果你發現了這個例外情況,它就像往常一樣。

2

現有的兩個答案似乎表示終結器將忽略任何未捕獲的異常。這似乎與此處的答案相矛盾:Exception in finalize method似乎對JSL有正確的參考。它表示,未捕獲的異常將終止有關對象的終結(可能泄漏資源),但終結器線程本身將繼續完成其他對象。這與實證結果相符。

+0

這是怎麼回事,然後說* uncought *(在終結器方法)異常被忽略? – 2015-11-24 06:53:33

+0

@OpDeCirkel,因爲未捕獲的異常不會被忽略;而是中止有關對象的最終確定。如果忽略終結器中拋出的異常,它會在繼續完成其他對象之前完成該對象的終結(並釋放它)。 – abligh 2015-11-24 06:58:02