W tym kodzie zostanie someVar
ustawiony, nawet jeśli zostanie wykonany blok catch i zostanie zgłoszony 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;
}
}
Odpowiedzi:
Tak, ostatnie bloki zawsze działają ... z wyjątkiem sytuacji, gdy:
System.exit(0);
Dodatkowo, jeśli metoda w twoim bloku last zgłosi nieprzechwycony wyjątek, to nic po nim nie zostanie wykonane (tj. Wyjątek zostanie wyrzucony tak, jak w każdym innym kodzie). Bardzo częstym przypadkiem, w którym to się dzieje, jest
java.sql.Connection.close()
.Na marginesie, zgaduję, że przykładowy kod, którego użyłeś, jest tylko przykładem, ale uważaj, aby umieścić rzeczywistą logikę w bloku final. Ostatni blok jest przeznaczony do czyszczenia zasobów (zamykanie połączeń z bazą danych, zwalnianie uchwytów plików itp.), A nie do logiki, która musi być uruchomiona. Jeśli musi być uruchomiony, zrób to przed blokiem try-catch, z dala od czegoś, co mogłoby zgłosić wyjątek, ponieważ Twoja intencja jest prawie na pewno funkcjonalnie taka sama.
źródło
finally
jest następnie określane jako normalne i nagłe zakończenie.Tak.
Zobacz dokumentację :
Wyjątki:
źródło
Wreszcie blok zawsze jest wykonywany.
}
źródło
Wreszcie jest zawsze wykonywany, bez względu na to, jaki jest twój przypadek, tj
W przypadku niezaznaczonych wyjątków java nie upoważnia do obsługi błędów. z tego powodu, jeśli niesprawdzony wyjątek wystąpi w ostatnim bloku to i nie zostanie wykonana żadna obsługa, kod zapisany poniżej tego punktu (w którym wystąpił błąd) nie zostanie wykonany.
Dlatego sugeruję, aby zawsze obsługiwać wszystkie wyjątki, może być zaznaczone lub odznaczone. W ten sposób możesz upewnić się, że blok kodu w końcu zostanie również wykonany, bez względu na to, czy wystąpi również niezaznaczony wyjątek. masz miejsce w złowieniu pod gniazdem i wreszcie blok, aby wykonać niezbędną pracę.
źródło
Ostateczny blok jest zawsze wykonywany, gdy blok try kończy działanie, chyba że masz System.exit (0) w trybie try lub catch.
źródło
Tak.
finally
blok jest wykonywany zawsze z wyjątkiem przypadku wywołania System.exit (), ponieważ zatrzymuje maszynę wirtualną Java.źródło