Метод Object.finalize() игнорирует возникшие исключения
Непосредственно из этого API:
Если с помощью метода finalize генерируется неперехваченное исключение, оно игнорируется, и завершение этого объекта завершается.
Я попытался вызвать finalize() явно после переопределения его следующим образом:
public void finalize() //
{
System.out.println("Garbage Collected");
throw new RuntimeException();
}
Когда я вызываю его явно, хотя получаю исключение, с другой стороны, если я его неявно отпускаю, все идет нормально, игнорируя исключение, как и ожидалось:
public static void main (String []args) throws Exception
{
B b = new B();
b=null;// LINE 3
System.gc(); // It prints "Garbage Collected" and do not throw the exception
//if it was b.finalize() instead of System.gc() and line 3 was commented out it would print Garbage Collected and then would throw the exception.
Почему это происходит? почему в первую очередь с помощью System.gc()
API соблюдаются, а при вызове явно нет?
1 ответ
99,99% времени, вы не хотите звонить finalize()
вручную, так как он будет неявно вызываться JVM, когда все ссылки на объект закрыты, и, таким образом, лучший способ удалить объект - это вручную null
все ссылки на него у вас есть, и пусть сборщик мусора работает сам по себе.
Когда вызов выполняется неявно, ссылок на объект больше нет, и, следовательно, исключение не может его перехватить, тогда как при явном вызове ссылка на объект будет существовать до тех пор, пока вызов не будет завершен.