我正在阅读的是
此外,该对象的终结意味着该对象已经被清理,这是否意味着该对象始终存在于内存中?
Java中不要使用finalize方法的原因
。该文章指出,GC线程会忽略由finalize方法引发的任何异常,并且不会进一步传播它们,那么为什么需要忽略呢?此外,该对象的终结意味着该对象已经被清理,这是否意味着该对象始终存在于内存中?
Java中不要使用finalize方法的原因
。该文章指出,GC线程会忽略由finalize方法引发的任何异常,并且不会进一步传播它们,那么为什么需要忽略呢?它忽略了异常,因为它没有处理异常的手段。finalize()方法的目的是在对象死亡之前进行最后的清理工作。如果您想在finalize()方法中处理异常,则需要添加代码来实现。
来自Effective Java
如果您还没有被说服避免使用finalizers,那么这里有另一个值得考虑的小贴士:如果在finalization期间抛出未捕获的异常,则会忽略该异常,并且该对象的finalization终止[JLS,12.6]。未捕获的异常可能会使对象处于损坏状态。如果另一个线程尝试使用这样的已损坏对象,则可能会导致任意的非确定性行为。通常,未捕获的异常将终止线程并打印堆栈跟踪,但如果发生在finalizer中,则甚至不会打印警告。
问题在于当在finalize
方法内部引发未捕获的异常时,对象可能会保持在损坏状态。在finalize
方法中忽略未捕获的异常,但这并不意味着GC忽略了Exception
,正如您的问题所暗示的那样。
finalize
方法传播出来的异常将被忽略。实质上,运行finalize
方法,无论它是以“正常”结束还是以异常结束,对象都会被标记为不再尝试进行终结。在下一个GC周期中,将忽略终结器并收集该对象(如果它不再被引用)。 (终结器可能会使其重新引用。) - Hot Licks