天天看點

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項。