finalize()方法中断执行中间时间?

时间:2019-06-20 01:50:39

标签: java finalization

问题

我有一个URLClassLoader匿名班。在其中,我重写了finalize()方法,以便对象在收集垃圾时会自动关闭:

protected void finalize() throws Throwable {
    close();
}

并且我已经重写了close()方法来打印一些信息:

public void close() throws IOException {
    System.out.println("Closing...");
    super.close();
    System.out.println("Closed.");
}

创建此对象后,立即调用System.gc()销毁它。如预期的那样,先调用finalize()方法,然后再调用close()方法,但我只看到Closing...打印到控制台。

为什么执行从未达到我的第二条打印语句?


注释

我怀疑发生的第一件事是super.close()抛出了一个异常,而为垃圾回收准备对象的一切都吞没了该异常,因此我尝试捕获任何Throwable并打印它:

public void close() throws IOException {
    System.out.println("Closing...");
    try {
        super.close();
        System.out.println("Closed.");
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

但是我得到的输出与以前相同:Closing...。接下来要做的是测试如果手动关闭类加载器会发生什么情况,因此在构造类加载器之后立即在类加载器上调用.close(),而不是运行System.gc();在这种情况下,我的两个打印语句均已运行:

Closing...
Closed.

0 个答案:

没有答案