2009-11-01 7 views

Odpowiedz

17

Jeśli nie, będziesz musiał mieć bloki try/catch za każdym razem, gdy uzyskasz dostęp do elementu tablicy, wykonałeś operację podziału i wiele innych typowych scenariuszy.

Ujmując to w inny sposób, wyobrazić ten kod:

Map map = ... 
int i = ... 
(int[])map.get("foo")[3] = 2334/i; 

musiałby sprawdzić ClassCastException, ArrayIndexOutofBoundsException, ArithmeticException, UnsupportedOperationException i NullPointerException tuż przy mojej głowie.

Z Javą problem nie jest odznaczony wyjątków. Sprawdzone wyjątki są bardzo kontrowersyjnym tematem. Niektórzy twierdzą, że był to w dużej mierze eksperyment z Javą i w praktyce nie działają, ale znajdziesz wielu ludzi, którzy twierdzą, że są dobrzy.

Nikt nie twierdzi, że niezaznaczone wyjątki są złe.

+0

"Nikt nie twierdzi, że niezaznaczone wyjątki są złe" - zdziwiłbyś się :-) Duży +1 na wszystko inne. – ChssPly76

+0

dzięki @cletus. – Moeb

+6

W rzeczywistości, jeśli sprawdzono wyjątek środowiska Runtime Exception, to i tak ciężko by było obsłużyć wyjątki, ponieważ prawie wszystko, co można zrobić w bloku catch, mogło spowodować nowe wyjątki środowiska wykonawczego, które z kolei musiałyby zostać obsłużone ... –

1

Oznacza to po prostu, że kompilator nie będzie zmuszał do szukania wyjątku, ale nadal można go wyrzucić w środowisku wykonawczym. Jedną z korzyści jest to, że możesz rzucić nowe wyjątki ze swoich klas, nie wymagając od ciebie zmiany interfejsu, co powoduje, że dzwoniący zmieniają swój kod.

8

Pomysł na dwa rodzaje wyjątków w Javie (zaznaczone i niezaznaczone) polega na tym, że sprawdzane wyjątki powinny być stosowane w przypadku warunków błędu, których można rozsądnie oczekiwać, a niesprawdzone wyjątki powinny być używane w przypadku nieoczekiwanych błędów.

Na przykład, jeśli plik nie zostanie znaleziony, otrzymasz numer FileNotFoundException i można oczekiwać, że twój program będzie w stanie obsłużyć taki warunek. Niezaznaczone wyjątki powinny być używane tylko w przypadku problemów, które nie powinny się zdarzyć, a to naprawdę oznacza, że ​​w programie wystąpił błąd, jeśli wystąpi taki problem. Na przykład: NullPointerException oznacza, że ​​program próbuje wyłuskać zmienną o wartości null i najprawdopodobniej jest to błąd.

Kompilator Java zmusza programistę do obsługi sprawdzanych wyjątków. To sprawia, że ​​język programowania jest bezpieczniejszy - oznacza to, że programista zmuszony jest pomyśleć o warunkach błędu, co powinno zwiększyć niezawodność programu.

Kompilator nie sprawdza niezaznaczonych wyjątków, ponieważ niezaznaczone wyjątki nie powinny się zdarzyć, a jeśli tak się stanie, nie ma niczego, co program mógłby racjonalnie robić w czasie wykonywania; programista musi rozwiązać problem.

Ta funkcja została poddana krytyce w Javie, niektórzy nawet sprawdzają wyjątki sprawdzane pod numerem a failed experiment i niektórym osobom propose to remove checked exceptions z Java.

+0

+1 za to czysty opis. – Reuben