Czy blok finally działa, nawet jeśli rzucisz nowy wyjątek?

W tym kodzie czy someVar zostanie ustawione, nawet jeśli blok catch zostanie wykonany i zostanie wyrzucony drugi wyjątek?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
Author: sharptooth, 2010-11-24

5 answers

Tak, ostatecznie bloki zawsze działa... z wyjątkiem sytuacji, gdy:

  • wątek uruchamiający blok try-catch-finally jest zabijany lub przerywany
  • używasz System.exit(0);
  • podstawowa maszyna wirtualna jest niszczona w inny sposób
  • podstawowy sprzęt jest w jakiś sposób bezużyteczny

Dodatkowo, jeśli jakaś metoda w Twoim bloku finally rzuci nieobciążony wyjątek, to nic po nim nie zostanie wykonane(tzn. wyjątek zostanie wyrzucony tak, jak w każdym innym kodzie). A bardzo częstym przypadkiem, gdzie to się dzieje, jest java.sql.Connection.close().

Na marginesie, domyślam się, że próbka kodu, której użyłeś, jest tylko przykładem, ale uważaj na umieszczenie rzeczywistej logiki w końcu bloku. Blok finally jest przeznaczony do czyszczenia zasobów (zamykanie połączeń DB, zwalnianie uchwytów plików itp.), a nie do logiki must-run. Jeśli musi-Uruchom zrób to przed blokiem try-catch, z dala od czegoś, co może rzucić wyjątek, ponieważ twoja intencja jest prawie na pewno funkcjonalnie to samo.

 146
Author: GaryF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-13 07:44:07

Tak.

Zobacz dokumentację :

Blok finalny zawsze wykonuje się, gdy wyjścia z bloku próbnego.

Wyjątki:

Uwaga: jeśli JVM wyjdzie podczas próby lub kod catch jest wykonywany, a następnie ostatni blok może nie zostać wykonany. Podobnie, jeśli wątek wykonujący kod try lub catch zostaje przerwany lub zabity, w końcu blok może nie wykonaj mimo, że aplikacja jako całość kontynuuje.

 9
Author: froadie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 08:53:34

Blok finally jest wykonywany zawsze, gdy blok try kończy działanie .chyba, że masz System.wyjście (0) w próbie lub złapać.

 1
Author: urmalp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 08:54:20

Tak. finally block wykonuje zawsze z wyjątkiem przypadku, w którym wywołujesz System.exit (), ponieważ zatrzymuje Java VM.

 1
Author: Vladimir Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 08:54:36

W końcu jest zawsze wykonywany, bez względu na to, co się dzieje, tzn.

  • try-catch-finally block
  • rzuty

Dla niezaznaczonych wyjątków java nie wymaga obsługi błędów. z tego powodu, jeśli w finally block then wystąpi niezaznaczony wyjątek i nie zostanie wykonana żadna obsługa, to kod napisany poniżej tego punktu (gdzie wystąpił błąd) nie zostanie wykonany.

Sugeruję więc, aby zawsze obsługiwać wszystkie wyjątki, które mogą być zaznaczone lub odznaczone. tędy. możesz upewnić się, że blok kodu w finally jest również wykonywany bez względu na to, czy wystąpi również niezaznaczony wyjątek. masz miejsce w sub Nest złapać i wreszcie zablokować, aby wykonać niezbędną pracę.

 0
Author: yug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 04:40:46