Большинство существующих ответов содержат части правильного ответа, но ни один из них не совсем точен.
Блок finally
всегда гарантированно будет достигнут после блоков try
и, возможно, catch
, если JVM не отключится заранее. Однако, если фрагмент кода внутри блока finally
завершает работу JVM или создает собственное исключение, конец блока может быть не достигнут.
Согласно Сертифицированному Sun по программированию для Java 6 Учебное пособие :
Единственное исключение из правила finally
-will-всегда-вызываться - это то, что finally
не будет вызываться, если JVM завершит работу.
То, что вызвано finally
, не означает, что оно завершится.
Последнее слово, как всегда, Спецификация языка Java . Поведение finally
подробно объясняется в §14.20.2 Выполнение try-catch-finally .
Как дополнительное примечание: вы правы, что return
в try
не остановит запуск finally
. Фактически, finally
вводится сразу после того, как return
обнаружен, до он выполняется.