Dlaczego NullPointerException nie jest zadeklarowany jako wyjątek sprawdzony

To było pytanie zadane w wywiadzie. NullPointerException jest bardzo często; dlaczego nie jest zadeklarowany jako zaznaczony wyjątek? Wygooglowałem, ale nie dostałem prawidłowej odpowiedzi.

Author: Keith Pinson, 2010-04-21

9 answers

Prawie każda metoda musiałaby zadeklarować rzucanie go.

public void myMethod(String param) throws NullPointerException {
   //
}

(jako notatka boczna-na przykład Eclipse wyświetla ostrzeżenie za każdym razem, gdy istnieje "potencjalny dostęp do wskaźnika null", dzięki czemu można zapobiec wyjątkowi tak wcześnie, jak to możliwe.)

 34
Author: Bozho,
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-04-21 14:54:00

Nie jest to sprawdzony wyjątek (między innymi) , ponieważ jest niezwykle powszechny. Może wystąpić praktycznie wszędzie. Je ¶ li zosta3o sprawdzone, to prawie ka ¿da metoda w ka ¿dym programie Java gdziekolwiek musia3aby zadeklarowaæ, ¿e jest ona throws NullPointerException.

 15
Author: Michael Borgwardt,
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-04-21 14:49:45

Wyjątki wskaźnika Null są rozszerzeniami WYJĄTKÓW Runtime i dlatego są nieoczekiwanymi zdarzeniami w przepływie programu. Nie ma sensu oczekiwać, że wyjątek ze wskaźnikiem null zostanie wyrzucony (mam nadzieję!) i dlatego nigdy nie zadeklarowałbyś tego jako wyjątku sprawdzonego.

 11
Author: Chris Knight,
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-04-21 14:49:32

Odpowiedź w jednym zdaniu jest taka, że jest to wynik błędu programowania, a wyjątki błędu programowania nie są wyjątkami sprawdzonymi (IllegalStateException, ClassCastException, itp.).

Ale nawet jeśli miałbyś argument, dlaczego może to być sprawdzony wyjątek, w zasadzie każda operacja na referencji obiektu może go wyrzucić, więc byłoby to wszędzie i dosłownie każda metoda w nietrywialnym programie musiałaby go wyrzucić - więc co by było punkt?

 3
Author: Yishai,
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-04-21 14:49:59

Zaznaczone wyjątki mogą wystąpić, ponieważ coś w środowisku , nad którym twój program ma niewielką lub żadną kontrolę, poszło nie tak (np. IOException, SQLException). Możesz to przewidzieć i zająć się tą sprawą.

A NullPointerException (zwykle) występuje, ponieważ w Twoim kodzie jest jakiś błąd. Jeśli oczekujesz wyrzucenia wyjątku NullPointerException, poprawnym rozwiązaniem jest naprawienie błędu zamiast obsługi wyjątku.

 3
Author: Heinzi,
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-04-21 15:01:09

Moja własna obowiązkowa definicja dla sprawdzonego wyjątku. Wyjątki zaznaczone to wyjątki, które wywołałoby API w przypadku wystąpienia znanej niepożądanej sytuacji

NullPointerExceptions nie wskazuje na" znaną niepożądaną " sytuację. Zamiast tego, są one zazwyczaj wyrzucane z powodu pewnych nieprzewidzianych sytuacji w kodzie. Oznacza to, że są one w większości przypadków z powodu złych praktyk kodowania-takich jak próba uzyskania rozmiaru listy, która nie jest prawidłowo zainicjowana itp. Nie ma więc sensu ich sprawdzać wyjątki - jak każdy obiekt w Javie może być null w pewnym momencie?!. NullPoitnerException też nigdy nie powinien być przechwytywany.

 2
Author: ring bearer,
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-04-21 14:50:29

Zaznaczone wyjątki są tylko dla wyjątków, w których program może odzyskać. Wywołanie czegoś na obiekcie NULL jest problemem programistów i nie można go odzyskać.

 1
Author: java_mouse,
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
2011-10-10 19:06:13

Po co ją włączać, skoro każda funkcja, którą piszesz, będzie musiała ją zadeklarować ? Żeby ułatwić Ci życie.

 0
Author: user324138,
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-04-23 12:36:50

Jeśli wystąpi wyjątek wskaźnika Null, Twój proram zatrzyma się.Stąd jest to wyjątek uchecked.

 0
Author: SW DEV07,
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
2015-01-06 16:48:03