【发布时间】:2013-01-23 15:33:27
【问题描述】:
如果对象的构造函数出现异常,是否有任何关于是否使用finalize() 清理对象的详细信息。
当这个方法被调用是出了名的错误定义。根据手册:
Java 编程语言不保证哪个线程会 为任何给定对象调用 finalize 方法。可以保证, 但是,调用 finalize 的线程不会持有任何 调用 finalize 时用户可见的同步锁。如果 finalize 方法抛出未捕获的异常,异常是 被忽略并且该对象的终结终止。
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize%28%29
我无法以这种方式触发 finalize 方法。有谁知道它是否被保证不被调用,或者在某些情况下在构造函数初始化对象失败后调用它(这是一个异常)。
我问这个是因为我有一个不能清理两次的对象。我试图了解在抛出异常之前清理是否安全,或者我是否必须为finalize() 留下标记才能有效地跳过并且什么也不做。
【问题讨论】:
-
+1 我怀疑这是你需要检查的东西,因为不同的 JVM 可能会有不同的行为。
-
使用
finalize是邪恶的。 -
@Peter JLS 非常具体,一旦 [base] 对象的构造函数成功完成,对象就可以完成。
-
@JasonPyeron 很好的说明。
标签: java exception constructor