Różnica między java.lang.RuntimeException i java.lang.Exception


210

Ktoś proszę wyjaśnić różnicę między java.lang.RuntimeExceptioni java.lang.Exception? Jak zdecydować, który z nich rozszerzyć, jeśli utworzę własny wyjątek?

Odpowiedzi:


181

Zasadniczo wyjątki RuntimeExceptionwyjątkami, którym można programowo zapobiec. Np NullPointerException, ArrayIndexOutOfBoundException. Jeśli zaznaczysz nullprzed wywołaniem dowolnej metody, NullPointerExceptionnigdy by się nie zdarzyło. Podobnie ArrayIndexOutOfBoundExceptionnigdy się nie zdarzy, jeśli najpierw sprawdzisz indeks. RuntimeExceptionnie są sprawdzane przez kompilator, więc jest to czysty kod.

EDYCJA : W dzisiejszych czasach ludzie wolą, RuntimeExceptionponieważ produkuje czysty kod. Jest to całkowicie osobisty wybór.


10
Podoba mi się ten kąt „wyjątków czasu wykonywania mógł być przez dzwoniącego uniknięty”. Oznacza to, że ty (jako osoba wywołująca metodę) powinieneś upewnić się, że nawet się nie zdarzy. Podczas gdy sprawdzone wyjątki są czymś, czego nie można uniknąć, a zamiast tego są zobowiązani do ich rozwiązania po fakcie. (I tak, ponieważ nie wszyscy zgadzają się z koncepcją sprawdzonych wyjątków i wiele osób używa RuntimeException do wszystkiego, to rozróżnienie stało się nieco mętne).
Thilo,

4
W dzisiejszych czasach ludzie preferują również niezaznaczone RuntimeException, ponieważ jest on zgodny z przetwarzaniem Java 8 Lambda, podczas gdy sprawdzone wyjątki typu Exception nie są.
Hartmut P.

2
Podejrzewam, że prawdziwym powodem, dla którego ludzie łapią, RuntimeExceptionjest 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 jak NullPointerException.
Dónal,

186

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.


3
Praktycznie to prawda, że ​​„istnieją dwa rodzaje wyjątków”, ale dlaczego dokumentacja Oracle twierdzi, że istnieją trzy typy wyjątków. Uważa błąd za trzeci typ. Myślę, że błąd wcale nie jest wyjątkiem, jest po prostu Throwable (obiektem), tak, naśladuje zachowanie wyjątków czasu wykonywania. Co byś o tym powiedział? Dok. Oracle ref. docs.oracle.com/javase/tutorial/essential/exceptions/…
Asif Shahzad

3
Błąd nie jest przeznaczony do wychwytywania (choć może być), generalnie używasz błędów do wychwytywania własnych błędów podczas pracy nad nowym kodem. Na przykład, jeśli masz drzewo, jeśli instrukcja if / elseif, w przeciwnym razie może wystąpić błąd Error („nie spodziewałem się, że ten warunek się wydarzy”) ;. Ogólnie rzecz biorąc, wyjątki mają przypadki użycia, w których POWINIENE się zdarzyć, podczas gdy błędy nie mają przypadku użycia i są błędem.
Danny,

5
Ale żartem jest to, że sam RunTimeException rozszerza wyjątek: D (Wiem, że to nie sprawia żadnych problemów, a JVM zajmuje się całym kontekstem)
Alireza Mohamadi

94

Przed patrząc na różnicę między java.lang.RuntimeExceptioni java.lang.Exceptionklas, trzeba znać Exceptionhierarchię. Zarówno Exceptioni Errorklasy pochodzą z klas Throwable(co wynika z klasy Object). A klasa RuntimeExceptionwywodzi się z klasy Exception.

Wszystkie wyjątki pochodzą od Exceptionlub RuntimeException.

Wszystkie wynikające z RuntimeExceptionnich 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.Exceptiona 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 .

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 

47

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.


15

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:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

W powyższej definicji klasy Process , metoda executemoże zgłosić wyjątek RuntimeException, ale deklaracja metody nie musi określać, że generuje wyjątek RuntimeException .

Metoda processzgł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 formularza new Process().process()powoduje błąd kompilacji. Wynika to z tego, że kod klienta powinien podjąć odpowiednie kroki MyException(powiedzmy, że call to process () może być ujęte w bloku try / catch).


13

Prawidłowe korzystanie z RuntimeException?

Z niesprawdzonych wyjątków - Kontrowersje :

Jeśli można zasadnie oczekiwać, że klient wyzdrowieje z wyjątku, uczyń go sprawdzonym wyjątkiem. Jeśli klient nie może nic zrobić w celu odzyskania od wyjątku, uczyń z niego niesprawdzony wyjątek.

Zauważ, że niesprawdzony wyjątek pochodzi od, RuntimeExceptiona sprawdzony wyjątek pochodzi od Exception.

Po co rzucać, RuntimeExceptionjeśli klient nie może nic zrobić, aby odzyskać od wyjątku? Artykuł wyjaśnia:

Wyjątki w czasie wykonywania reprezentują problemy wynikające z problemów programistycznych i dlatego nie można oczekiwać, że kod klienta API odzyska od nich lub w jakikolwiek sposób sobie z nimi poradzi. Takie problemy obejmują wyjątki arytmetyczne, takie jak dzielenie przez zero; wyjątki wskaźnika, takie jak próba dostępu do obiektu przez odwołanie zerowe; oraz indeksowanie wyjątków, takich jak próba dostępu do elementu tablicy za pośrednictwem indeksu, który jest zbyt duży lub zbyt mały.


5

Z dokumentacji Oracle:

Oto podstawowa wytyczna: jeśli można zasadnie oczekiwać, że klient wyzdrowieje z wyjątku, ustaw go jako sprawdzony wyjątek. Jeśli klient nie może nic zrobić w celu odzyskania od wyjątku, uczyń z niego niesprawdzony wyjątek.

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 ...


4

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 .


3

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


0

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.


0

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


0
  1. 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.

  2. Wyjątkiem zdefiniowanym przez użytkownika może być niestandardowy wyjątek sprawdzany, jeśli rozszerza się on na klasę wyjątków

  3. Wyjątek zdefiniowany przez użytkownika może być niestandardowym wyjątkiem niezaznaczonym, jeśli rozszerza się na klasę wyjątków czasu wykonywania.

  4. Zdefiniuj klasę i uczyń ją dzieckiem wyjątku lub wyjątku czasu wykonywania

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.