У 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
заяви.