2011-06-08 47 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