В try
блоке завершается с исполнением return
заявления и стоимостью s
на момент return
оператор выполняет это значение , возвращаемое методом. Тот факт, что finally
предложение позже изменяет значение s
(после завершения return
оператора), не изменяет (в этот момент) возвращаемое значение.
Обратите внимание, что вышеизложенное касается изменений самого значения s
в finally
блоке, а не объекта, на который s
ссылается. Если бы s
была ссылка на изменяемый объект (а String
это не так) и содержимое объекта было изменено в finally
блоке, то эти изменения будут видны в возвращаемом значении.
Подробные правила того, как все это работает, можно найти в разделе 14.20.2 спецификации языка Java. . Обратите внимание, что выполнение return
оператора считается внезапным завершением try
блока (применяется раздел, начинающийся с « Если выполнение блока try завершается внезапно по любой другой причине R .... »). См. Раздел 14.17 JLS, чтобы узнать, почему return
оператор является внезапным завершением блока.
Более подробно: если как try
блок, так и finally
блок try-finally
оператора внезапно завершаются из-за return
операторов, то применяются следующие правила из §14.20.2:
Если выполнение try
блока завершается преждевременно по какой-либо другой причине R [кроме выдачи исключения], тогда выполняется finally
блок, и тогда есть выбор:
- Если
finally
блок завершается нормально, то try
оператор завершается преждевременно по причине R.
- Если
finally
блок завершается внезапно по причине S, тоtry
оператор завершается преждевременно по причине S (и причина R отбрасывается).
В результате return
оператор в finally
блоке определяет возвращаемое значение всего try-finally
оператора, а возвращаемое значение из try
блока отбрасывается. Подобное происходит в try-catch-finally
операторе, если try
блок выдает исключение, он перехватывается catch
блоком, и у catch
блока и у finally
блока есть return
операторы.