Java: влияние создания исключения в finalize () - PullRequest
1 голос
/ 06 февраля 2020

Я запутался в этом утверждении в Java Do c объекта # finalize ():

Любое исключение, выброшенное методом finalize, вызывает остановку завершения этого объекта, но в противном случае игнорируется.

Влияет или нет исключение, выданное finalize(), на финализацию объекта?

1 Ответ

1 голос
/ 18 марта 2020

Предложение

Любое исключение, сгенерированное методом finalize, вызывает остановку завершения этого объекта, но в противном случае игнорируется.

действительно вводит в заблуждение. Странно, но в той же документации есть более точное предложение, незадолго до него:

Если метод finalize создает неперехваченное исключение, оно игнорируется, и завершение этого объекта завершается.

Таким образом, речь идет только о неперехваченных исключениях , а не об исключениях, генерируемых и перехваченных в finalize() или методе, вызванном finalize(). Далее «остановлено» означает «прекращено», не приостановлено или заблокировано.

Это становится более понятным, если учесть, что « завершение объекта » означает «, вызывая его finalize() метод », а не восстановление памяти объекта, которая полностью независима от этого. Таким образом, завершение завершения не является неожиданным поведением, так как неперехваченные исключения всегда завершают текущее выполнение метода. «В противном случае» означает «помимо завершения текущей финализации», указывая на отсутствие других побочных эффектов, например, отсутствие регистрации и никакого влияния на финализацию других объектов.

Это отличается от, например, наличия бесконечного l oop в finalize() метод. Это действительно может блокировать выделенный поток, предотвращая завершение других объектов.

...