直接来自API:
如果finalize方法抛出未捕获的异常,则 异常被忽略,该对象的终结终止。
我尝试在覆盖它之后显式调用finalize(),如下所示:
public void finalize() //
{
System.out.println("Garbage Collected");
throw new RuntimeException();
}
当我明确地调用它时,虽然我确实得到了异常,但另一方面,如果我让它隐含地去,它会很好地忽略预期的异常:
public static void main (String []args) throws Exception
{
B b = new B();
b=null;// LINE 3
System.gc(); // It prints "Garbage Collected" and do not throw the exception
//if it was b.finalize() instead of System.gc() and line 3 was commented out it would print Garbage Collected and then would throw the exception.
为什么会这样?为什么使用System.gc()
的第一种方式是尊重API并且明确调用时不是?
答案 0 :(得分:4)
99.99%的时间,您不想手动调用finalize()
,因为当关闭对象的所有引用时,JVM将隐式调用它,因此删除该对象的最佳方法是object是手动null
所有对它的引用,让垃圾收集器自行工作。
当隐式调用时,不再有对该对象的引用,因此该异常没有任何东西可以捕获它,而在显式调用中,对该对象的引用将一直存在,直到调用完成后。 / p>