W try
finalizuje bloku z realizacją return
oświadczenia i wartości s
w momencie return
oświadczenie wykonuje to wartość zwracana przez metodę. Fakt, że finally
klauzula później zmienia wartość s
(po zakończeniu return
instrukcji) nie zmienia (w tym momencie) wartości zwracanej.
Zwróć uwagę, że powyższe dotyczy zmian wartości s
samego siebie w finally
bloku, a nie obiektu, do którego się s
odnosi. Gdyby s
było odniesieniem do zmiennego obiektu (a String
nie jest), a zawartość obiektu została zmieniona w finally
bloku, to te zmiany byłyby widoczne w zwracanej wartości.
Szczegółowe zasady działania tego wszystkiego można znaleźć w sekcji 14.20.2 specyfikacji języka Java . Należy zauważyć, że wykonanie return
instrukcji liczy się jako nagłe zakończenie try
bloku (obowiązuje sekcja rozpoczynająca się od „ Jeśli wykonanie bloku try nagle kończy się z innego powodu R… ”). Zobacz sekcję 14.17 JLS, aby dowiedzieć się, dlaczego return
oświadczenie jest nagłym zakończeniem bloku.
W celu uzyskania dalszych szczegółów: jeśli zarówno try
blokada, jak i finally
blokada try-finally
oświadczenia return
ulegają nagłemu przerwaniu z powodu oświadczeń, wówczas obowiązują następujące zasady z §14.20.2:
Jeśli wykonanie try
bloku kończy się nagle z innego powodu R [oprócz rzucenia wyjątku], wtedy finally
blok jest wykonywany, a następnie jest wybór:
- Jeśli
finally
blok kończy się normalnie, try
instrukcja kończy się nagle z powodu R.
- Jeśli
finally
blok kończy się nagle z powodu S, to try
instrukcja kończy się nagle z powodu S (i powód R jest odrzucany).
W rezultacie return
instrukcja w finally
bloku określa zwracaną wartość całej try-finally
instrukcji, a wartość zwracana z try
bloku jest odrzucana. Podobnie dzieje się w try-catch-finally
instrukcji, jeśli try
blok zgłasza wyjątek, zostaje przechwycony przez catch
blok i zarówno blok, jak catch
i finally
blok mają return
instrukcje.