3

问题

我有一个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.
4

0 回答 0