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