天天看点

Java中为什么在重写finalize()方法时首选调用super.finalize()?

我收到SonarQube错误:" 强制建议在此方法实现结束时调用super.finalize(),以防父实现必须也处置一些系统资源。"

但我发现Object类没有finalize方法的实现。

那么为什么需要调用super.finalize()?

这不是一个需要,它是一个应该遵循的终结者写作成语。

如果在将来的任何时候,您重构代码并且您的类扩展了其他可能具有finalize方法的类,这种做法将防止出现奇怪的错误。

这个成语是:

try {
   // Do whatever the finalization is
}
finally {
   super.finalize();
}
           

这确保了即使抛出一些异常,也会调用超类终结器(如果有一个非平凡的终结器)(因为没有捕获终结器中的异常,它们的执行只是停止)。

如何避免终结者 ,可以参考Joshua Bloch的Effective Java第二版第7项。