W tryfinalizuje bloku z realizacją returnoświadczenia i wartości sw momencie returnoświadczenie wykonuje to wartość zwracana przez metodę. Fakt, że finallyklauzula później zmienia wartość s(po zakończeniu returninstrukcji) nie zmienia (w tym momencie) wartości zwracanej.
Zwróć uwagę, że powyższe dotyczy zmian wartości ssamego siebie w finallybloku, a nie obiektu, do którego się sodnosi. Gdyby sbyło odniesieniem do zmiennego obiektu (a Stringnie jest), a zawartość obiektu została zmieniona w finallybloku, 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 returninstrukcji liczy się jako nagłe zakończenie trybloku (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 returnoświadczenie jest nagłym zakończeniem bloku.
W celu uzyskania dalszych szczegółów: jeśli zarówno tryblokada, jak i finallyblokada try-finallyoświadczenia returnulegają nagłemu przerwaniu z powodu oświadczeń, wówczas obowiązują następujące zasady z §14.20.2:
Jeśli wykonanie trybloku kończy się nagle z innego powodu R [oprócz rzucenia wyjątku], wtedy finallyblok jest wykonywany, a następnie jest wybór:
- Jeśli
finallyblok kończy się normalnie, tryinstrukcja kończy się nagle z powodu R.
- Jeśli
finallyblok kończy się nagle z powodu S, to tryinstrukcja kończy się nagle z powodu S (i powód R jest odrzucany).
W rezultacie returninstrukcja w finallybloku określa zwracaną wartość całej try-finallyinstrukcji, a wartość zwracana z trybloku jest odrzucana. Podobnie dzieje się w try-catch-finallyinstrukcji, jeśli tryblok zgłasza wyjątek, zostaje przechwycony przez catchblok i zarówno blok, jak catchi finallyblok mają returninstrukcje.