Java の不思議な挙動、、、

不思議というほど不思議ではないが、言語仕様を読んだだけでは理解できない Java の奇妙な振る舞いの一例。

public class FinalizeTest {

  public FinalizeTest() throws Exception {
    throw new Exception();
  }
    
  public static void main(String[] args) throws Exception {
    FinalizeTest test = null;
    try {
      test = new FinalizeTest();
    } catch(Exception e) {
    } 

    if (test == null) {
      System.out.println("不幸にもこのオブジェクトの生成は失敗する");
      System.gc();
      Thread.sleep(1000);
    }
  }

  protected void finalize() {
    System.out.println("しかし何故か finalize() は呼び出される");
  }
}

Javaインスタンスの「生成」がどの時点で完了しているのか、Javaソースコードレベルでは分かり辛いという話です。バイトコードレベルで考えると、別に疑問は生じないと思われ。