Object.finalize()方法忽略抛出的异常

时间:2013-09-08 13:04:06

标签: java garbage-collection finalize

直接来自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并且明确调用时不是?

1 个答案:

答案 0 :(得分:4)

99.99%的时间,您不想手动调用finalize(),因为当关闭对象的所有引用时,JVM将隐式调用它,因此删除该对象的最佳方法是object是手动null所有对它的引用,让垃圾收集器自行工作。

当隐式调用时,不再有对该对象的引用,因此该异常没有任何东西可以捕获它,而在显式调用中,对该对象的引用将一直存在,直到调用完成后。 / p>