Różnice między wyjątkiem a błędem

173

Próbuję dowiedzieć się więcej o podstawowej Javie i różnych typach Throwables. Czy ktoś może mi powiedzieć o różnicach między wyjątkami i błędami?

Marco Leung
źródło

Odpowiedzi:

178

Błędów nie należy wychwytywać ani naprawiać (z wyjątkiem najrzadszych przypadków). Wyjątkami są chleb powszedni obsługi wyjątków. Javadoc wyjaśnia to dobrze:

Błąd to podklasa Throwable, która wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić. Większość takich błędów to nienormalne warunki.

Przyjrzyj się kilku podklasom programu Error, biorąc niektóre z ich komentarzy JavaDoc:

  • AnnotationFormatError - Zgłaszane, gdy parser adnotacji próbuje odczytać adnotację z pliku klasy i stwierdza, że ​​adnotacja jest źle sformułowana.
  • AssertionError - Zgłoszony, aby wskazać, że asercja nie powiodła się.
  • LinkageError- Podklasy LinkageError wskazują, że klasa jest zależna od innej klasy; jednak druga klasa zmieniła się niekompatybilnie po kompilacji poprzedniej klasy.
  • VirtualMachineError - Zgłoszony, aby wskazać, że wirtualna maszyna języka Java jest uszkodzona lub zabrakło zasobów niezbędnych do jej dalszego działania.

Istnieją naprawdę trzy ważne podkategorie Throwable:

  • Error - Coś wystarczająco poważnego poszło nie tak i większość aplikacji powinna ulec awarii, zamiast próbować rozwiązać problem,
  • Niezaznaczony wyjątek (aka RuntimeException) - Bardzo często błąd programowania, taki jak NullPointerExceptionlub niedozwolony argument. Aplikacje mogą czasami obsługiwać tę Throwablekategorię lub odzyskiwać ją z tej kategorii - lub przynajmniej przechwytywać ją w run()metodzie Thread , rejestrować skargę i kontynuować działanie.
  • Zaznaczony wyjątek (inaczej wszystko inne) - oczekuje się, że aplikacje będą w stanie wychwycić i znacząco zrobić coś z resztą, na przykład FileNotFoundExceptioni TimeoutException...
Eddie
źródło
10
Oracle mówi, że Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors. Wiem, że rodzi pytanie: czy błąd jest wyjątkiem? , ale tak piszą. Oto tylko jeden z tych przykładów: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer
1
Pytanie bez odpowiedzi brzmi: czym różnią się między sobą wyjątki RuntimeException i Error? Obie są niesprawdzone i równe pod każdym innym względem.
Pacerier,
38

Ten slajd przedstawiający hierarchię wyjątków Javy autorstwa @ georgios-gousios zwięźle wyjaśnia różnice między błędami a wyjątkami w Javie.

Hierarchia wyjątków Java

avandeursen
źródło
6
Bardzo chciałbym zobaczyć, jak ktoś dochodzi do siebie po NullPointerException: D: D: D
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Może i ma nawet sens (drugie pytanie brzmi, czy jest dobre). Zwykle sprawdzasz, czy obiekt istnieje, a następnie wywołujesz metodę lub używasz pola. Ale zamiast sprawdzać istnienie możesz spróbować zamiast tego wyłapać NPE. I zapisz wiadomość o tym i idź dalej, na przykład.
Gangnus,
@Gangnus: nie ma sensu. Pamiętaj, że wyjątek pomija fragmenty kodu i jest sposobem na zgłoszenie błędów, a nie normalne operacje
Ignacio Soler Garcia
17

Błędy zwykle sygnalizują koniec aplikacji, jaką znasz. Zwykle nie można go odzyskać i powinien spowodować zamknięcie maszyny wirtualnej. Nie powinno się ich łapać poza ewentualnym logowaniem lub wyświetlaniem i odpowiednim komunikatem przed wyjściem.

Przykład: OutOfMemoryError - Niewiele możesz zrobić, ponieważ Twój program nie może już działać.

Wyjątki są często możliwe do odzyskania, a nawet jeśli tak się nie stanie, zazwyczaj oznaczają po prostu, że próba operacji nie powiodła się, ale program może nadal działać.

Przykład: IllegalArgumentException - przekazano nieprawidłowe dane do metody, więc wywołanie metody nie powiodło się, ale nie ma to wpływu na przyszłe operacje.

To są uproszczone przykłady, a inne bogactwo informacji dotyczy samych tylko wyjątków.

Rudzik
źródło
Spójrz na przykłady.javacodegeeks.com/ java-basics/ exceptions/ ... jako przykład. IllegalArgumentException to wyjątek czasu wykonywania, a nie błąd. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus
8

Błędy -

  1. Errors w java są typu java.lang.Error .
  2. Wszystkie błędy w Javie są niezaznaczone.
  3. Errordzieje się w czasie wykonywania. Nie będą znane kompilatorowi.
  4. Nie można naprawić błędów.
  5. Errors są najczęściej spowodowane przez środowisko, w którym działa aplikacja.
  6. Przykłady: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Wyjątki -

  1. Exceptions w java są typu java.lang.Exception.
  2. Exceptions obejmują zarówno zaznaczony, jak i niezaznaczony typ.
  3. Sprawdzone wyjątki są znane kompilatorowi, gdzie niezaznaczone wyjątki nie są znane kompilatorowi, ponieważ występują w czasie wykonywania.
  4. Możesz odzyskać od wyjątków, obsługując je za pomocą try-catchbloków.
  5. Exceptions są głównie spowodowane przez samą aplikację.
  6. Przykłady: Sprawdzone wyjątkami: SQLException, IOException
    niezaznaczone Wyjątki: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

dalsze czytanie: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

roottraveller
źródło
7

Sun ujął to najlepiej :

Błąd to podklasa Throwable, która wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić.

Władca
źródło
3

Opis Errorzajęć jest dość jasny:

Jest Errorpodklasą tego, Throwable co wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić. Większość takich błędów to nieprawidłowe warunki. ThreadDeath Błąd, choć „normalnym” stanie, jest również podklasaError ponieważ większość aplikacji nie należy próbować go złapać.

Metoda nie musi deklarować w swojej klauzuli throws żadnych podklas, Errorktóre mogą zostać wyrzucone podczas wykonywania metody, ale nie zostaną przechwycone, ponieważ te błędy są nienormalnymi warunkami, które nigdy nie powinny wystąpić.

Cytowane z dokumentacji klasyError Javy .

Krótko mówiąc, nie powinieneś łapać Errors, chyba że masz ku temu dobry powód. (Na przykład, aby zapobiec awariom implementacji serwera WWW, jeśli serwletowi zabraknie pamięci lub coś w tym rodzaju).

Z Exceptiondrugiej strony, an jest zwykłym wyjątkiem, jak w każdym innym nowoczesnym języku. Szczegółowy opis można znaleźć w dokumentacji Java API lub w dowolnym zasobie online lub offline.

Tobias Müller
źródło
2

Istnieje kilka podobieństw i różnic między klasami java.lang.Exceptioni java.lang.Error.

Podobieństwa:

  • Po pierwsze - obie klasy rozciąga się java.lang.Throwablei na skutek dziedziczy wiele metod, które są powszechne stosowane przy obsłudze błędów, takich jak: getMessage, getStackTrace, printStackTracei tak dalej.

  • Po drugie, jako podklasy java.lang.Throwableobu dziedziczą następujące właściwości:

    • Sam Throwable i dowolne z jego podklas (w tym java.lang.Error) można zadeklarować na liście wyjątków metod za pomocą throwssłowa kluczowego. Taka deklaracja wymagane tylko dla java.lang.Exceptioni podklasy, o java.lang.Throwable, java.lang.Errora java.lang.RuntimeException, a ich podklasy jest opcjonalne.

    • Tylko java.lang.Throwablei podklasy mogą być używane w catchklauzuli.

    • java.lang.ThrowableZe słowem kluczowym - można używać tylko i podklas throw.

Wniosek z tej właściwości wynika z obu java.lang.Errori java.lang.Exceptionmoże być zadeklarowany w nagłówku metody, może być w catchklauzuli, może być używany ze słowem kluczowym throw.

Różnice:

  • Po pierwsze - różnica pojęciowa: java.lang.Errorzaprojektowana do wyrzucenia przez JVM i wskazania poważnych problemów oraz do zatrzymania wykonywania programu zamiast bycia złapanym (ale jest to możliwe jak w przypadku każdego innego java.lang.Throwablenastępcy).

    Fragment z opisu javadoc o java.lang.Error:

    ... wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić.

    Z drugiej strony java.lang.Exceptionzaprojektowany do reprezentowania błędów, które są oczekiwane i mogą być obsługiwane przez programistę bez przerywania wykonywania programu.

    Fragment z opisu javadoc o java.lang.Exception:

    ... wskazuje warunki, które rozsądna aplikacja może chcieć złapać.

  • Druga różnica między java.lang.Errori java.lang.Exceptionta pierwsza uważana jest za niezaznaczony wyjątek do sprawdzania wyjątków w czasie kompilacji. Ponieważ wynikowy kod java.lang.Errorlub jego podklasy nie wymagają deklarowania tego błędu w nagłówku metody. Podczas rzucania java.lang.Exceptionwymaganej deklaracji w nagłówku metody.

Diagram klas miotania i jego następcy (właściwości i metody są pomijane). wprowadź opis obrazu tutaj

Michajłow Valentine
źródło
1

IMO błąd to coś, co może spowodować awarię aplikacji i nie należy go obsługiwać. Wyjątkiem jest coś, co może powodować nieprzewidywalne wyniki, ale można je odzyskać.

Przykład:

Jeśli programowi zabrakło pamięci, jest to błąd, ponieważ aplikacja nie może kontynuować. Jednakże, jeśli program akceptuje nieprawidłowy typ danych wejściowych, jest to wyjątek, ponieważ program może go obsłużyć i przekierować, aby otrzymać poprawny typ danych wejściowych.

Panie Will
źródło
1

Błędy są głównie powodowane przez środowisko, w którym działa aplikacja. Na przykład OutOfMemoryError występuje, gdy JVM zabraknie pamięci lub StackOverflowError występuje, gdy stos się przepełnia.

Wyjątki są powodowane głównie przez samą aplikację. Na przykład NullPointerException występuje, gdy aplikacja próbuje uzyskać dostęp do obiektu o wartości null lub ClassCastException występuje, gdy aplikacja próbuje rzutować niezgodne typy klas.

Źródło: różnica między błędem a wyjątkiem w Javie

user2485429
źródło
„Błędy są głównie powodowane przez środowisko, w którym działa aplikacja” oraz „Wyjątki są głównie powodowane przez samą aplikację” idealnie!
ADJ
0

Oto całkiem dobre podsumowanie interfejsu API języka Java, co oznacza błąd i wyjątek:

Błąd to podklasa Throwable, która wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić. Większość takich błędów to nienormalne warunki. Błąd ThreadDeath, chociaż jest stanem „normalnym”, jest również podklasą błędu, ponieważ większość aplikacji nie powinna próbować go wychwycić.

Metoda nie musi deklarować w swojej klauzuli throws żadnych podklas Error, które mogą zostać wyrzucone podczas wykonywania metody, ale nie zostaną przechwycone, ponieważ te błędy są nienormalnymi warunkami, które nigdy nie powinny wystąpić.

OTOH, for Exceptions, Java API mówi:

Klasa Exception i jej podklasy są formą Throwable, która wskazuje warunki, które rozsądna aplikacja może chcieć złapać.

egaga
źródło
0

Błędy są powodowane przez środowisko, w którym działa aplikacja lub program. W większości przypadków nie można odzyskać danych, ponieważ kończy to działanie aplikacji lub programu. Javadoc radzi, aby nie przejmować się wyłapywaniem takich błędów, ponieważ środowisko np. JVM, na takie błędy i tak będzie zamknięte.

Przykłady: VirtualMachineError- Zgłoszony, aby wskazać, że wirtualna maszyna języka Java jest uszkodzona lub zabrakło zasobów niezbędnych do jej dalszego działania. OutOfMemoryErrorwystępuje, gdy JVM zabraknie pamięci lub StackOverflowErrorgdy stos się skończy.

Wyjątki są powodowane przez samą aplikację lub program; może z powodu twojego własnego błędu. W większości przypadków można go odzyskać, a aplikacja nadal będzie działać. Zaleca się wychwycenie takich błędów, aby zapobiec nieprawidłowemu zakończeniu działania aplikacji lub programu i / lub móc dostosować komunikat wyjątku, aby użytkownicy widzieli ładnie sformatowany komunikat zamiast domyślnych brzydkich komunikatów o wyjątkach rozrzuconych po całym miejscu.

Przykłady: NullPointerExceptionwystępuje, gdy aplikacja próbuje uzyskać dostęp do obiektu zerowego. lub Próba uzyskania dostępu do tablicy z nieistniejącym indeksem lub wywołanie funkcji z nieprawidłowymi danymi lub parametrami.

podpis
źródło