Они отличаются, если
-
try
-блок завершается броском java.lang.Throwable
, который не является java.lang.Exception
, например, потому что это java.lang.Error
, например AssertionError
или OutOfMemoryError
. - блок try завершается внезапно, используя оператор потока управления, такой как
continue
, break
или return
- блок catch завершается внезапно (бросаялюбой бросаемый или использующий оператор потока управления)
В целом, язык Java гарантирует, что блок finally выполняется до завершения оператора try.(Обратите внимание, что, если оператор try не завершен, нет гарантии относительно оператора finally. Оператор может не завершиться по ряду причин, включая завершение работы оборудования, завершение работы ОС, завершение работы виртуальной машины (например, из-за System.exit
),ожидающий поток (Thread.suspend()
, synchronized
, Object.wait()
, Thread.sleep()
) или занятый другим образом (бесконечные циклы ,,,).
Таким образом, блок finally
является лучшим местомдля действий по очистке, чем конец тела метода, но сам по себе, все еще не может гарантировать очистку exeuction.