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