Question
I have a URLClassLoader anonymous class. In it, I've overridden the finalize() method so that the object will automatically close itself when garbage collected:
protected void finalize() throws Throwable {
close();
}
and I've overridden the close() method to print some information:
public void close() throws IOException {
System.out.println("Closing...");
super.close();
System.out.println("Closed.");
}
Immediately after creating this object, I call System.gc() to destroy it. As expected, the finalize() method gets called, and then the close() method gets called, but I only see Closing... get printed to the console.
Why does execution never reach my second print statement?
Notes
The first thing that I suspected was happening was that super.close() was throwing an exception, and whatever prepares an object for garbage collection was swallowing the exception, so I tried catching any Throwable and printing it:
public void close() throws IOException {
System.out.println("Closing...");
try {
super.close();
System.out.println("Closed.");
} catch (Throwable e) {
e.printStackTrace();
}
}
But I got the same exact output as before: Closing.... The next thing I did was test what would happen if I closed the class loader manually, so I just called .close() on my class loader, immediately after constructing it, instead of running System.gc(); In this case, both of my print statements were run:
Closing...
Closed.