Sprawdzam nowy kod. Program ma tylko próbę i ostatecznie blokuje. Ponieważ blok catch jest wykluczony, w jaki sposób działa blok try, jeśli napotka wyjątek lub cokolwiek, co można wyrzucić? Czy po prostu przechodzi bezpośrednio do ostatniego bloku?
java
try-catch
finally
try-catch-finally
try-finally
NullPointer0x00
źródło
źródło
Odpowiedzi:
Jeśli jakikolwiek kod w bloku try może zgłosić sprawdzony wyjątek, musi pojawić się w klauzuli throws podpisu metody. Jeśli zostanie zgłoszony niesprawdzony wyjątek, zostanie on przepuszczony z metody.
Ostatni blok jest zawsze wykonywany, niezależnie od tego, czy został zgłoszony wyjątek, czy nie.
źródło
Mała uwaga na temat
try
/finally
: Final zawsze będzie wykonywany, chyba żeSystem.exit()
jest nazywany.try{}
bloku nigdy końców (na przykład pętla bez końca).źródło
try{..} catch{ throw ..} finally{..}
? Myślę, że ostatecznie nie zostanie straconySpecyfikacja języka Java (1) opisuje sposób
try-catch-finally
wykonywania. Brak zaczepu jest równoznaczny z brakiem możliwości złapania danego Rzutu.(1) Wykonanie try-catch-last
źródło
Ostatecznie wewnętrzny jest wykonywany przed wyrzuceniem wyjątku do zewnętrznego bloku.
Prowadzi do
źródło
Ostatni blok jest zawsze uruchamiany po zakończeniu bloku try, niezależnie od tego, czy try kończy się normalnie, czy nienormalnie z powodu wyjątku, eee, rzucanego.
Jeśli wyjątek zostanie zgłoszony przez dowolny kod w bloku try, wówczas bieżąca metoda po prostu ponownie zgłasza (lub nadal zgłasza) ten sam wyjątek (po uruchomieniu ostatniego bloku).
Jeśli ostatni blok rzuca wyjątek / błąd / rzucanie, a istnieje już oczekujący przedmiot do rzucania, robi się brzydki. Szczerze mówiąc, dokładnie zapominam, co się dzieje (tyle z mojego certyfikatu sprzed lat). Myślę, że oba przedmioty miotane łączą się ze sobą, ale jest pewne specjalne voodoo, które musisz zrobić (tj. Wywołanie metody, którą musiałbym podnieść), aby rozwiązać pierwotny problem, zanim „w końcu” zwymiotował, eee, zwymiotował.
Nawiasem mówiąc, spróbuj / w końcu jest dość powszechną czynnością przy zarządzaniu zasobami, ponieważ java nie ma destruktorów.
Np. -
„W końcu”, jeszcze jedna wskazówka: jeśli nie przeszkadza, aby umieścić w połowu, albo specyficzne catch (spodziewane) Throwable podklasy lub po prostu złapać „Throwable”, nie „Wyjątek” dla ogólnego catch-all pułapkę błędu. Zbyt wiele problemów, takich jak błędy związane z odbiciami, powoduje wyświetlenie „błędów” zamiast „wyjątków”, a te znikną po każdym „złapaniu wszystkiego” zakodowanym jako:
zrób to zamiast tego:
źródło
Wersje Java przed wersją 7 pozwalają na te trzy kombinacje try-catch-last ...
finally
blok będzie zawsze wykonywany bez względu na to, co się dzieje w blokutry
lub / icatch
. więc jeśli nie macatch
bloku, wyjątek nie będzie tutaj obsługiwany.Jednak nadal będziesz potrzebować obsługi wyjątków gdzieś w kodzie - chyba że chcesz, aby aplikacja całkowicie się zawiesiła. Zależy to od architektury aplikacji, w której dokładnie znajduje się ten program obsługi.
źródło
Wyjątek jest wyrzucany z bloku, tak jak w każdym innym przypadku, gdy nie jest przechwytywany.
Ostateczny blok jest wykonywany niezależnie od tego, w jaki sposób blok try został zakończony - niezależnie od tego, czy w ogóle są jakieś catch, niezależnie od tego, czy istnieje pasujący catch.
Bloki catch i ostatnie są prostopadłymi częściami bloku try. Możesz mieć jedno lub oba. Z Javą 7 nie będziesz mieć żadnego!
źródło
Nie próbujesz tego z tym programem? W końcu zostanie zablokowany i wykonany zostanie ostatni blok, ale wyjątek nie zostanie obsłużony. Ale ten wyjątek można zmienić w ostatnim bloku!
źródło
Ostatni blok jest wykonywany po zakończeniu bloku try. Jeśli coś zostanie wrzucone do bloku try po opuszczeniu bloku, wykonywany jest ostatni blok.
źródło
Wewnątrz
try
bloku piszemy kody, które mogą zgłosić wyjątek. Wcatch
bloku obsługujemy wyjątek.finally
Blok jest zawsze wykonywany bez względu na to, czy wyjątek występuje, czy nie.Teraz, jeśli mamy blok try-final zamiast try-catch-last blok, wtedy wyjątek nie będzie obsługiwany i po bloku try zamiast kontroli będzie przechodził do bloku końcowego. Możemy użyć bloku try-final, gdy nie chcemy nic robić z wyjątkiem.
źródło
Niezależnie od wyjątku zgłoszonego lub nie w
try
bloku -finally
blok zostanie wykonany. Wyjątek nie zostałby przechwycony.źródło