Ktoś proszę wyjaśnić różnicę między java.lang.RuntimeException
i java.lang.Exception
? Jak zdecydować, który z nich rozszerzyć, jeśli utworzę własny wyjątek?
210
Zasadniczo wyjątki RuntimeException są wyjątkami, którym można programowo zapobiec. Np NullPointerException
, ArrayIndexOutOfBoundException
. Jeśli zaznaczysz null
przed wywołaniem dowolnej metody, NullPointerException
nigdy by się nie zdarzyło. Podobnie ArrayIndexOutOfBoundException
nigdy się nie zdarzy, jeśli najpierw sprawdzisz indeks. RuntimeException
nie są sprawdzane przez kompilator, więc jest to czysty kod.
EDYCJA : W dzisiejszych czasach ludzie wolą, RuntimeException
ponieważ produkuje czysty kod. Jest to całkowicie osobisty wybór.
RuntimeException
jest to, że jest to proste i eliminuje potrzebę zastanawiania się nad różnicami między sprawdzonymi i niesprawdzonymi wyjątkami. Myślę, że wyłapywanie wyjątków czasu wykonywania jest okropnym pomysłem, ponieważ wychwytujesz wyjątki niemożliwe do odzyskania, takie jakNullPointerException
.W Javie istnieją dwa typy wyjątków: sprawdzone wyjątki i niezaznaczone wyjątki. Sprawdzony wyjątek musi być obsługiwany jawnie przez kod, podczas gdy niezaznaczony wyjątek nie musi być jawnie obsługiwany.
W przypadku zaznaczonych wyjątków musisz albo umieścić blok try / catch wokół kodu, który potencjalnie może wyrzucić wyjątek, albo dodać do metody klauzulę „throws”, aby wskazać, że metoda może zgłosić ten typ wyjątku (który musi być obsługiwane w klasie wywołującej lub wyższej).
Każdy wyjątek pochodzący od „wyjątku” jest sprawdzonym wyjątkiem, podczas gdy klasa wywodząca się z RuntimeException nie jest zaznaczona. RuntimeExceptions nie muszą być jawnie obsługiwane przez kod wywołujący.
źródło
Przed patrząc na różnicę między
java.lang.RuntimeException
ijava.lang.Exception
klas, trzeba znaćException
hierarchię. ZarównoException
iError
klasy pochodzą z klasThrowable
(co wynika z klasyObject
). A klasaRuntimeException
wywodzi się z klasyException
.Wszystkie wyjątki pochodzą od
Exception
lubRuntimeException
.Wszystkie wynikające z
RuntimeException
nich wyjątki są nazywane niesprawdzonymi wyjątkami. Wszystkie pozostałe wyjątki są sprawdzane . Zaznaczony wyjątek musi zostać przechwycony gdzieś w kodzie, w przeciwnym razie nie zostanie skompilowany. Dlatego nazywane są sprawdzonymi wyjątkami. Z drugiej strony, z nie zaznaczonymi wyjątkami, metoda wywołująca nie jest zobowiązana do jej obsługi ani deklarowania.Dlatego wszystkie wyjątki, które kompilator zmusza do obsługi, pochodzą bezpośrednio,
java.lang.Exception
a wszystkie inne, z których kompilator nie zmusza cię do obsługi, pochodząjava.lang.RuntimeException
.Poniżej przedstawiono niektóre z bezpośrednich znanych podklas RuntimeException .
źródło
Wyjątek jest sprawdzany, a RuntimeException nie jest zaznaczony.
Zaznaczone oznacza, że kompilator wymaga, abyś obsługiwał wyjątek w catch lub zadeklarował metodę jako rzucającą go (lub jedną z jego nadklas).
Zasadniczo wyrzuć sprawdzony wyjątek, jeśli oczekuje się, że wywołujący interfejs API obsłuży wyjątek, i niesprawdzony wyjątek, jeśli jest to coś, co wywołujący normalnie nie byłby w stanie obsłużyć, na przykład błąd z jednym z parametrów, np. Programowanie błąd.
źródło
Klasy wyjątków środowiska wykonawczego (RuntimeException i jego podklasy) są zwolnione z sprawdzania czasu kompilacji, ponieważ kompilator nie może ustalić, że wyjątki czasu wykonywania nie mogą wystąpić. (z JLS).
W projektowanych klasach należy podklasować wyjątek i zgłaszać jego instancje, aby zasygnalizować wszelkie wyjątkowe scenariusze. W ten sposób będziesz wyraźnie sygnalizował klientom swojej klasy, że użycie twojej klasy może spowodować wyjątek i muszą podjąć kroki, aby obsłużyć te wyjątkowe scenariusze.
Poniższe fragmenty kodu wyjaśniają ten punkt:
W powyższej definicji klasy Process , metoda
execute
może zgłosić wyjątek RuntimeException, ale deklaracja metody nie musi określać, że generuje wyjątek RuntimeException .Metoda
process
zgłasza sprawdzony wyjątek i powinna zadeklarować, że wyrzuci sprawdzony wyjątek rodzaju MyException, a nie zrobienie tego będzie błędem kompilacji.Powyższa definicja klasy wpłynie również na kod korzystający z klasy Process .
Wywołanie
new Process().execute()
jest prawidłowym wywołaniem, w którym jako wywołanie formularzanew Process().process()
powoduje błąd kompilacji. Wynika to z tego, że kod klienta powinien podjąć odpowiednie krokiMyException
(powiedzmy, że call to process () może być ujęte w bloku try / catch).źródło
Prawidłowe korzystanie z RuntimeException?
Z niesprawdzonych wyjątków - Kontrowersje :
Zauważ, że niesprawdzony wyjątek pochodzi od,
RuntimeException
a sprawdzony wyjątek pochodzi odException
.Po co rzucać,
RuntimeException
jeśli klient nie może nic zrobić, aby odzyskać od wyjątku? Artykuł wyjaśnia:źródło
Z dokumentacji Oracle:
Wyjątki czasu wykonywania reprezentują problemy wynikające z problemów programistycznych i jako takie nie można oczekiwać, że kod klienta API odzyska od nich lub w jakikolwiek sposób sobie z nimi poradzi.
RuntimeExceptions są jak „wyjątki z powodu nieprawidłowego użycia interfejsu API” przykłady runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException
Z wyjątkami musisz to wyraźnie złapać, ponieważ nadal możesz coś zrobić, aby odzyskać. Przykładami wyjątków są: IOException, TimeoutException, PrintException ...
źródło
W prostych słowach, jeśli klient / użytkownik może odzyskać z wyjątku wtedy zrobić to sprawdzone Wyjątek , jeśli klient nie może nic, aby odzyskać od wyjątek następnie dokonać jej Nieograniczony RuntimeException . Np. RuntimeException byłby błędem programistycznym, takim jak dzielenie przez zero, żaden użytkownik nie może nic na to poradzić poza samym programistą, wtedy jest to RuntimeException .
źródło
RuntimeException to klasa potomna klasy Exception
Jest to jedna z wielu klas potomnych klasy Wyjątek. RuntimeException jest nadklasą tych wyjątków, które mogą zostać zgłoszone podczas normalnej pracy wirtualnej maszyny Java. Metoda nie jest wymagana do deklarowania w swojej klauzuli throws żadnych podklas RuntimeException, które mogą zostać wygenerowane podczas wykonywania metody, ale nie zostaną przechwycone.
Hierarchia jest
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
źródło
Wyjątki to dobry sposób na obsługę nieoczekiwanych zdarzeń w przepływie aplikacji. RuntimeException nie jest zaznaczone przez kompilator, ale możesz preferować stosowanie wyjątków, które rozszerzają klasę wyjątków, do kontrolowania zachowania klientów interfejsu API, ponieważ są oni zobowiązani do wychwytywania błędów podczas kompilacji. Tworzy również dobrą dokumentację.
Jeśli chcesz uzyskać czysty interfejs, użyj dziedziczenia, aby podklasować różne typy wyjątków w twojej aplikacji, a następnie ujawnić wyjątek nadrzędny.
źródło
Istnieją dwa rodzaje wyjątków. Możesz odzyskać z zaznaczonego wyjątku, jeśli otrzymasz taki wyjątek. Wyjątek środowiska wykonawczego jest nie do odzyskania, wyjątkami środowiska wykonawczego są błędy programistyczne, a programista powinien zająć się tym podczas pisania kodu, a dalsze wykonywanie tego może dać niepoprawny wynik. Wyjątki czasu wykonywania dotyczą naruszenia warunków wstępnych np. masz tablicę o rozmiarze 10 i próbujesz uzyskać dostęp do 11. elementu, spowoduje to wygenerowanie wyjątku ArrayIndexOutOfBoundException
źródło
Wyjątkiem zdefiniowanym przez użytkownika może być wyjątek sprawdzany lub wyjątek niezaznaczony, zależy to od klasy, do której się rozszerza.
Wyjątkiem zdefiniowanym przez użytkownika może być niestandardowy wyjątek sprawdzany, jeśli rozszerza się on na klasę wyjątków
Wyjątek zdefiniowany przez użytkownika może być niestandardowym wyjątkiem niezaznaczonym, jeśli rozszerza się na klasę wyjątków czasu wykonywania.
Zdefiniuj klasę i uczyń ją dzieckiem wyjątku lub wyjątku czasu wykonywania
źródło