この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.
なぜそれが起こるのですか?APIを使用する最初の方法でSystem.gc()
は尊重され、明示的に呼び出された場合は尊重されないのはなぜですか?