Słowo kluczowe “finally” w Javie

Słowo kluczowe “finally” w Javie

Cześć! 

    Wraz z dzisiejszym wpisem chciałbym kontynuować serię o słowach kluczowych w języku Java. Jeśli przegapiłeś poprzedni wpis o słowie kluczowym “final“, to kliknij tutaj, aby przeczytać post. Pozwolę zacytować zdanie z poprzedniego wpisu: słowa kluczowe to jedno z częstych pytań na java junior developerów. Pytanie brzmi zazwyczaj: “wymień różnicę między „final”, „finally” oraz „finalize” wraz z przykładami praktycznymi”. W dzisiejszym wpisie na czynniki pierwsze rozłożymy słowo “finally” – do dzieła!

Finally

    Finally definiuje blok kodu, którego używamy razem ze słowem kluczowym try. Definiuje on fragment kodu, który jest zawsze uruchamiany po bloku try i ewentualnym bloku catch, przed zakończeniem działania metody. Blok finally wykona się niezależnie od zachowania wyjątku.
 

Przykład praktyczny

Spójrzmy na ten fragment kodu:
Słowo kluczowe finally - przykład praktyczny [1]. www.biegajacyprogramista.pl

W powyzszym przykładzie, niezależnie od wartości parametru “length“, wirtualna maszyna javy wykona blok finally i wypisze “jestem w środku słowa kluczowego”.

Przykład użycia bez bloku catch

Ponadto, możemy użyć bloku finally z blokiem try niezależnie od tego, czy blok catch jest obecny. Przykład:

Słowo kluczowe finally - przykład praktyczny [2]. www.biegajacyprogramista.pl

Wynikiem tej operacji będzie:

Słowo kluczowe finally - przykład praktyczny [3]. www.biegajacyprogramista.pl

Dlaczego finally jest przydatne?

     Zwykle bloku finally używa się do wykonywania kodu “czyszczącego”, tzn. do zamykania połączeń, plików czy zarządzania cyklem wątków, ponieważ jest wykona się zawsze, niezależnie od zachowania wyjątku. 

Kiedy finally jest wykonywane?

     Chciałbym omówić kilka przykładów wywołania bloku finally i wyjaśnić dlaczego wirtualna maszyna javy wywołuje kod w takiej, a nie innej kolejności.

Brak rzuconego wyjątku

Gdy blok try zakończy się, wykonywany jest blok finally, nawet jeśli wystąpił wyjątek: 

Słowo kluczowe finally - przykład praktyczny [4]. www.biegajacyprogramista.pl

W tym przykładzie, nie rzucamy wyjątku w bloku try. Z tego powodu wirtualna maszyna javy wykonuje cały kod zarówno w bloku try jak i finally. Wynik wykonywanego kodu będzie następujący:

Słowo kluczowe finally - przykład praktyczny [5]. www.biegajacyprogramista.pl

Wyjątek jest rzucony lecz nieobsługiwany

 Jeśli wystąpi wyjątek i nie zostanie on złapany, blok finally jest nadal wykonywany:
Słowo kluczowe finally - przykład praktyczny [6]. www.biegajacyprogramista.pl

JVM wykonuje blok finally nawet w przypadku nieobsłużonego wyjątku. Wyjście:

Słowo kluczowe finally - przykład praktyczny [7]. www.biegajacyprogramista.pl

Wyjątek jest rzucony oraz obsłużony

Jeśli wystąpi wyjątek i zostanie on złapany przez blok catch, blok finally jest nadal wykonywany:

Słowo kluczowe finally - przykład praktyczny [8]. www.biegajacyprogramista.pl

W tym przypadku, blok catch obsługuje rzucony wyjątek, a następnie JVM wykonuje blok finally i wypisuje następujące dane wyjściowe:

Słowo kluczowe finally - przykład praktyczny [9]. www.biegajacyprogramista.pl

Return w bloku try

Return również nie zapobiegnie uruchomieniu bloku finally:

Słowo kluczowe finally - przykład praktyczny [10]. www.biegajacyprogramista.pl

Kiedy rzucamy wyjątkiem z bloku try, blok catch odpowiednio się nim zajmie. Mimo, że w bloku catch znajduje się instrukcja return, JVM wykona blok finally przed przekazaniem kontroli do metody wywołującej. Dane wyjściowe będą następujące:

Słowo kluczowe finally - przykład praktyczny [11]. www.biegajacyprogramista.pl

Return w bloku catch

Gdy blok catch zawiera instrukcję return, blok finally jest nadal wywoływany:
 
Słowo kluczowe finally - przykład praktyczny [12]. www.biegajacyprogramista.pl

Kiedy rzucamy wyjątek z bloku try, blok catch zajmuje się tym wyjątkiem. Mimo, że w bloku catch znajduje się instrukcja return, JVM wykonuje blok finally przed przekazaniem kontroli do metody wywołującej i wypisuje następujące dane:

Słowo kluczowe finally - przykład praktyczny [13]. www.biegajacyprogramista.pl

No dobra, to kiedy finally się nie wykona?

     Jak to w życiu bywa, zawsze znajdzie się wyjątek od reguły. Istnieją pewne sytuacje, kiedy JVM nie wykona bloku finally. Oto przykłady:

  • System.exit(1) – w momencie, kiedy wywołamy System.exit(1) wykonywanie jakiegokolwiek dalszego kodu jest przerywane, co równoznaczne jest z zignorowaniem bloku finally
  • Halt – podobnie jak w System.exit, wywołanie Runtime.halt również zatrzymuje wykonanie, a wirtualna maszyna javy nie wykona bloku finally

Podsumowanie

      Jest to prawdopodobnie pierwszy post, gdzie kod przeważa nad tekstem i jestem z tego powodu zadowolony. Przedstawiłem dzisiaj pojęcie słowa kluczowego “finally“, wyjaśniając jego działanie od wewnątrz. Warto pamiętać o tym słowie kluczowym, ponieważ podczas czyszczenia zasobów może zapobiec zbędnej duplikacji kodu. Kojarzycie jeszcze jakieś przypadki, kiedy blok finally się nie wykona? Dajcie znać! W kolejnym poście dotyczącym programowania omówię słowo kluczowe “finalize”.

Pozdrawiam serdecznie,
biegajacyprogramista.pl

Dodaj komentarz

one × three =

Close Menu