В 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операторы.