У tryблоці завершується з виконанням returnзаяви і вартістю sна момент returnоператор виконує це значення , що повертається методом. Той факт, що finallyпізніше додаток змінює значення s(після завершення returnоператора), не (у цей момент) змінює повернене значення.
Зауважимо, що вище стосується змін значення sсебе в finallyблоці, а не об'єкта, на який sпосилається. Якщо sбуло б посилання на об'єкт, що змінюється (який Stringне є), а вміст об'єкта було змінено в finallyблоці, то ці зміни будуть видно у поверненому значенні.
Детальні правила того, як все це працює, можна знайти в розділі 14.20.2 Специфікації мови Java . Зауважте, що виконання returnоператора вважається різким припиненням tryблоку (застосовується розділ, який починається " Якщо виконання блоку спробу завершено різко з будь-якої іншої причини R .... "). Дивіться розділ 14.17 JLS, чому returnзаява є різким припиненням блоку.
Докладніше: якщо і tryблок, і finallyблок try-finallyзаяви різко припиняються через returnзаяви, застосовуються такі правила з § 14.20.2:
Якщо виконання tryблоку різко завершується з будь-якої іншої причини R [окрім викидання виключення], finallyблок виконується, і тоді є вибір:
- Якщо
finallyблок завершується нормально, то tryзаява різко завершується з причини Р.
- Якщо
finallyблок завершується різко через причину S, то tryвираз завершується різко з причини S (а причина R відкидається).
Результатом є те, що returnоператор у finallyблоці визначає повернене значення всього try-finallyоператора, а повернене значення з tryблоку відкидається. Подібна річ відбувається в try-catch-finallyоператорі, якщо tryблок кидає виняток, його спіймає catchблок, і в catchблоці, і в finallyблоці є returnзаяви.