Unterschiede zwischen Ausnahme und Fehler

173

Ich versuche, mehr über grundlegendes Java und die verschiedenen Arten von Throwables zu erfahren. Kann mir jemand die Unterschiede zwischen Ausnahmen und Fehlern mitteilen?

Marco Leung
quelle

Antworten:

178

Fehler sollten nicht abgefangen oder behandelt werden (außer in den seltensten Fällen). Ausnahmen sind das A und O der Ausnahmebehandlung. Der Javadoc erklärt es gut:

Ein Fehler ist eine Unterklasse von Throwable, die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte. Die meisten dieser Fehler sind abnormale Zustände.

Schauen Sie sich einige der Unterklassen von an Errorund nehmen Sie einige ihrer JavaDoc-Kommentare:

  • AnnotationFormatError - Wird ausgelöst, wenn der Annotation-Parser versucht, eine Annotation aus einer Klassendatei zu lesen, und feststellt, dass die Annotation fehlerhaft ist.
  • AssertionError - Wird geworfen, um anzuzeigen, dass eine Behauptung fehlgeschlagen ist.
  • LinkageError- Unterklassen von LinkageError geben an, dass eine Klasse von einer anderen Klasse abhängig ist. Die letztere Klasse hat sich jedoch nach der Kompilierung der ersteren Klasse inkompatibel geändert.
  • VirtualMachineError - Wird ausgelöst, um anzuzeigen, dass die Java Virtual Machine defekt ist oder keine Ressourcen mehr zur Verfügung stehen, um den Betrieb fortzusetzen.

Es gibt wirklich drei wichtige Unterkategorien Throwable:

  • Error - Es ist etwas Schlimmes schiefgegangen. Die meisten Anwendungen sollten abstürzen, anstatt zu versuchen, das Problem zu lösen.
  • Ungeprüfte Ausnahme (aka RuntimeException) - Sehr oft ein Programmierfehler wie ein NullPointerExceptionoder ein unzulässiges Argument. Anwendungen können diese ThrowableKategorie manchmal verarbeiten oder wiederherstellen - oder zumindest nach der run()Methode des Threads abfangen , die Beschwerde protokollieren und weiter ausführen.
  • Checked Exception (aka Alles anderes) - Anwendungen werden voraussichtlich in der Lage sein , zu fangen und nach Bedeutung etwas zu tun mit dem Rest, wie FileNotFoundExceptionund TimeoutException...
Eddie
quelle
10
Oracle sagt das Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors. Ich weiß, dass es die Frage aufwirft: Ist Fehler eine Ausnahme? , aber das schreiben sie. Hier ist nur eines dieser Beispiele: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer
1
Die unbeantwortete Frage ist, wie sich RuntimeException und Error im Wesentlichen unterscheiden. Beide sind deaktiviert und in jeder anderen Hinsicht gleich.
Pacerier
38

Diese Folie mit der Ausnahmehierarchie von Java von @ georgios-gousios erläutert kurz die Unterschiede zwischen Fehlern und Ausnahmen in Java.

Java-Ausnahmehierarchie

avandeursen
quelle
6
Ich würde gerne jemanden sehen, der sich von einer NullPointerException erholt: D: D: D
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Es kann sein und es hat sogar Sinn (die andere Frage ist, ob es gut ist). Normalerweise überprüfen Sie, ob das Objekt vorhanden ist, und rufen danach die Methode auf oder verwenden das Feld. Aber Sie können stattdessen versuchen, NPE zu fangen, anstatt nach Existenz zu suchen. Und protokollieren Sie eine Nachricht darüber und fahren Sie zum Beispiel fort.
Gangnus
@ Gangnus: macht keinen Sinn. Denken Sie daran, dass eine Ausnahme Teile des Codes überspringt und eine Möglichkeit ist, Fehler zu melden, nicht den normalen Betrieb
Ignacio Soler Garcia
17

Fehler signalisieren in der Regel das Ende Ihrer Anwendung, wie Sie es kennen. Es kann normalerweise nicht wiederhergestellt werden und sollte dazu führen, dass Ihre VM beendet wird. Das Abfangen sollte nur erfolgen, um möglicherweise zu protokollieren oder anzuzeigen und eine entsprechende Meldung vor dem Beenden anzuzeigen.

Beispiel: OutOfMemoryError - Sie können nicht viel tun, da Ihr Programm nicht mehr ausgeführt werden kann.

Ausnahmen können häufig wiederhergestellt werden, und selbst wenn dies nicht der Fall ist, bedeutet dies im Allgemeinen nur, dass ein versuchter Vorgang fehlgeschlagen ist, Ihr Programm jedoch weiterhin ausgeführt werden kann.

Beispiel: IllegalArgumentException - Ungültige Daten an eine Methode übergeben, sodass der Methodenaufruf fehlgeschlagen ist, zukünftige Operationen jedoch nicht beeinflusst werden.

Dies sind vereinfachende Beispiele, und es gibt eine weitere Fülle von Informationen nur zu Ausnahmen.

Robin
quelle
Schauen Sie sich als Beispiel examples.javacodegeeks.com/java-basics/exceptions/… an. IllegalArgumentException ist eine Laufzeitausnahme, kein Fehler. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus
8

Fehler -

  1. Errors in Java sind vom Typ java.lang.Error.
  2. Alle Fehler in Java sind vom Typ deaktiviert.
  3. Errors passieren zur Laufzeit. Sie werden dem Compiler nicht bekannt sein.
  4. Es ist unmöglich, Fehler zu beheben.
  5. Errors werden hauptsächlich durch die Umgebung verursacht, in der die Anwendung ausgeführt wird.
  6. Beispiele: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Ausnahmen -

  1. Exceptions in Java sind vom Typ java.lang.Exception.
  2. Exceptions umfassen sowohl aktivierte als auch nicht aktivierte Typen.
  3. Überprüfte Ausnahmen sind dem Compiler bekannt, während nicht aktivierte Ausnahmen dem Compiler nicht bekannt sind, da sie zur Laufzeit auftreten.
  4. Sie können Ausnahmen beheben, indem Sie sie über try-catchBlöcke behandeln.
  5. Exceptions werden hauptsächlich durch die Anwendung selbst verursacht.
  6. Beispiele: Checked Ausnahmen: SQLException, IOException
    Ungeprüfter Ausnahmen: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

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

Roottraveller
quelle
7

Sun drückt es am besten aus :

Ein Fehler ist eine Unterklasse von Throwable, die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte.

Powerlord
quelle
3

Die Beschreibung der ErrorKlasse ist ganz klar:

An Errorist eine Unterklasse Throwable , die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte. Die meisten dieser Fehler sind abnormale Zustände. Der ThreadDeath Fehler ist zwar ein "normaler" Zustand, aber auch eine Unterklasse vonError da die meisten Anwendungen nicht versuchen sollten, ihn abzufangen.

Eine Methode muss in ihrer Throws-Klausel keine Unterklassen deklarieren Error, die während der Ausführung der Methode möglicherweise ausgelöst, aber nicht abgefangen werden, da diese Fehler abnormale Bedingungen sind, die niemals auftreten sollten.

Zitiert aus Javas eigener Dokumentation der KlasseError .

Kurz gesagt, Sie sollten Errors nicht fangen , es sei denn, Sie haben einen guten Grund dafür. (Zum Beispiel, um zu verhindern, dass Ihre Implementierung des Webservers abstürzt, wenn einem Servlet der Speicherplatz ausgeht oder so etwas.)

Ein Exceptionist dagegen nur eine normale Ausnahme wie in jeder anderen modernen Sprache. Eine ausführliche Beschreibung finden Sie in der Java-API-Dokumentation oder in einer Online- oder Offline-Ressource.

Tobias Müller
quelle
2

Es gibt verschiedene Ähnlichkeiten und Unterschiede zwischen Klassen java.lang.Exceptionund java.lang.Error.

Ähnlichkeiten:

  • Erster - beide Klassen erweitert java.lang.Throwableund als Ergebnis erbt viele der Verfahren , die gemeinsam genutzt werden soll , wenn sie mit Fehlern wie der Umgang: getMessage, getStackTrace, printStackTraceund so weiter.

  • Zweitens java.lang.Throwableerben beide als Unterklassen folgende Eigenschaften:

    • Throwable selbst und jede seiner Unterklassen (einschließlich java.lang.Error) können mit dem throwsSchlüsselwort in der Liste der Methodenausnahmen deklariert werden. Eine solche Erklärung nur erforderlich für java.lang.Exceptionund Unterklassen, für java.lang.Throwable, java.lang.Errorund java.lang.RuntimeExceptionund deren Subklassen ist optional.

    • Nur java.lang.Throwableund Unterklassen dürfen in der catchKlausel verwendet werden.

    • Nur java.lang.Throwableund Unterklassen können mit dem Schlüsselwort - verwendet werden throw.

Die Schlussfolgerung aus dieser Eigenschaft folgt beiden java.lang.Errorund java.lang.Exceptionkann im Methodenheader deklariert werden, kann in catchKlausel sein, kann mit Schlüsselwort verwendet werden throw.

Unterschiede:

  • Erster konzeptioneller Unterschied: java.lang.ErrorEntwickelt, um von der JVM ausgelöst zu werden und auf schwerwiegende Probleme hinzuweisen, und beabsichtigt, die Programmausführung zu stoppen, anstatt abgefangen zu werden (dies ist jedoch wie bei jedem anderen java.lang.ThrowableNachfolger möglich).

    Eine Passage aus der Javadoc- Beschreibung über java.lang.Error:

    ... weist auf schwerwiegende Probleme hin, die eine vernünftige Anwendung nicht abfangen sollte.

    Im Gegenteil java.lang.Exception, um Fehler darzustellen, die erwartet wurden und von einem Programmierer behandelt werden können, ohne die Programmausführung zu beenden.

    Eine Passage aus der Javadoc- Beschreibung über java.lang.Exception:

    ... gibt Bedingungen an, die eine vernünftige Anwendung möglicherweise abfangen möchte.

  • Der zweite Unterschied zwischen java.lang.Errorund java.lang.Exceptiondem ersten wird als ungeprüfte Ausnahme für die Ausnahmeprüfung zur Kompilierungszeit angesehen. Da das Auslösen des Ergebniscodes java.lang.Erroroder seine Unterklassen diesen Fehler nicht im Methodenheader deklarieren müssen. Beim Auslösen der java.lang.Exceptionerforderlichen Deklaration im Methodenheader.

Throwable und sein Nachfolgerklassendiagramm (Eigenschaften und Methoden werden weggelassen). Geben Sie hier die Bildbeschreibung ein

Mikhailov Valentine
quelle
1

IMO ein Fehler ist etwas, das dazu führen kann, dass Ihre Anwendung fehlschlägt und nicht behandelt werden sollte. Eine Ausnahme kann zu unvorhersehbaren Ergebnissen führen, die jedoch behoben werden können.

Beispiel:

Wenn einem Programm der Speicherplatz ausgeht, liegt ein Fehler vor, da die Anwendung nicht fortgesetzt werden kann. Wenn ein Programm jedoch einen falschen Eingabetyp akzeptiert, ist dies eine Ausnahme, da das Programm damit umgehen und umleiten kann, um den richtigen Eingabetyp zu erhalten.

Mr. Will
quelle
1

Fehler werden hauptsächlich durch die Umgebung verursacht, in der die Anwendung ausgeführt wird. Beispielsweise tritt OutOfMemoryError auf, wenn JVM nicht genügend Speicher zur Verfügung steht, oder StackOverflowError tritt auf, wenn der Stapel überläuft.

Ausnahmen werden hauptsächlich durch die Anwendung selbst verursacht. Beispielsweise tritt NullPointerException auf, wenn eine Anwendung versucht, auf ein Nullobjekt zuzugreifen, oder ClassCastException, wenn eine Anwendung versucht, inkompatible Klassentypen umzuwandeln.

Quelle: Unterschied zwischen Fehler und Ausnahme in Java

user2485429
quelle
"Fehler werden hauptsächlich durch die Umgebung verursacht, in der die Anwendung ausgeführt wird" und "Ausnahmen werden hauptsächlich durch die Anwendung selbst verursacht" perfekt!
ADJ
0

Hier ist eine ziemlich gute Zusammenfassung der Java-API, was ein Fehler und eine Ausnahme darstellt:

Ein Fehler ist eine Unterklasse von Throwable, die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte. Die meisten dieser Fehler sind abnormale Zustände. Der ThreadDeath-Fehler ist zwar eine "normale" Bedingung, aber auch eine Unterklasse von Error, da die meisten Anwendungen nicht versuchen sollten, ihn abzufangen.

Eine Methode muss in ihrer Throws-Klausel keine Fehlerklassen deklarieren, die möglicherweise während der Ausführung der Methode ausgelöst, aber nicht abgefangen werden, da diese Fehler abnormale Bedingungen sind, die niemals auftreten sollten.

OTOH, für Ausnahmen, sagt Java API:

Die Klasse Exception und ihre Unterklassen sind eine Form von Throwable, die Bedingungen angibt, die eine vernünftige Anwendung möglicherweise abfangen möchte.

egaga
quelle
0

Fehler werden durch die Umgebung verursacht, in der Ihre Anwendung oder Ihr Programm ausgeführt wird. In den meisten Fällen können Sie möglicherweise keine Wiederherstellung durchführen, da dies Ihre Anwendung oder Ihr Programm beendet. Javadoc hat empfohlen, solche Fehler nicht abzufangen, da die Umgebung, z. B. JVM, bei solchen Fehlern sowieso beendet wird.

Beispiele: VirtualMachineError- Wird ausgelöst, um anzuzeigen, dass die Java Virtual Machine defekt ist oder keine Ressourcen mehr zur Verfügung stehen, um den Betrieb fortzusetzen. OutOfMemoryErrortritt auf, wenn JVM nicht genügend Speicher hat oder StackOverflowErrorwenn der Stapel überläuft.

Ausnahmen werden durch Ihre Anwendung oder Ihr Programm selbst verursacht. Vielleicht aufgrund Ihres eigenen Fehlers. In den meisten Fällen können Sie sich davon erholen, und Ihre Anwendung wird weiterhin ausgeführt. Es wird empfohlen, solche Fehler abzufangen, um ein abnormales Beenden Ihrer Anwendung oder Ihres Programms zu verhindern und / oder die Ausnahmemeldung so anzupassen, dass die Benutzer eine gut formatierte Nachricht anstelle der überall verstreuten hässlichen Standardausnahmemeldungen sehen.

Beispiele: NullPointerExceptionTritt auf, wenn eine Anwendung versucht, auf ein Nullobjekt zuzugreifen. oder Der Versuch, auf ein Array mit einem nicht vorhandenen Index zuzugreifen oder eine Funktion mit falschen Daten oder Parametern aufzurufen.

Pasignatur
quelle