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 のソースコードレベルでは分かり辛いという話です。バイトコードレベルで考えると、別に疑問は生じないと思われ。