Ich versuche, mehr über grundlegendes Java und die verschiedenen Arten von Throwables zu erfahren. Kann mir jemand die Unterschiede zwischen Ausnahmen und Fehlern mitteilen?
173
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 Error
und 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.RuntimeException
) - Sehr oft ein Programmierfehler wie ein NullPointerException
oder ein unzulässiges Argument. Anwendungen können diese Throwable
Kategorie manchmal verarbeiten oder wiederherstellen - oder zumindest nach der run()
Methode des Threads abfangen , die Beschwerde protokollieren und weiter ausführen.FileNotFoundException
und TimeoutException
...
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/… .Diese Folie mit der Ausnahmehierarchie von Java von @ georgios-gousios erläutert kurz die Unterschiede zwischen Fehlern und Ausnahmen in Java.
quelle
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.
quelle
Fehler -
Error
s in Java sind vom Typjava.lang.Error
.Error
s passieren zur Laufzeit. Sie werden dem Compiler nicht bekannt sein.Error
s werden hauptsächlich durch die Umgebung verursacht, in der die Anwendung ausgeführt wird.java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Ausnahmen -
Exception
s in Java sind vom Typjava.lang.Exception
.Exception
s umfassen sowohl aktivierte als auch nicht aktivierte Typen.try-catch
Blöcke behandeln.Exception
s werden hauptsächlich durch die Anwendung selbst verursacht.SQLException
,IOException
Ungeprüfter Ausnahmen:
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
Lesen Sie weiter: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
quelle
Sun drückt es am besten aus :
quelle
Die Beschreibung der
Error
Klasse ist ganz klar:Zitiert aus Javas eigener Dokumentation der Klasse
Error
.Kurz gesagt, Sie sollten
Error
s 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
Exception
ist 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.quelle
Es gibt verschiedene Ähnlichkeiten und Unterschiede zwischen Klassen
java.lang.Exception
undjava.lang.Error
.Ähnlichkeiten:
Erster - beide Klassen erweitert
java.lang.Throwable
und als Ergebnis erbt viele der Verfahren , die gemeinsam genutzt werden soll , wenn sie mit Fehlern wie der Umgang:getMessage
,getStackTrace
,printStackTrace
und so weiter.Zweitens
java.lang.Throwable
erben beide als Unterklassen folgende Eigenschaften:Throwable selbst und jede seiner Unterklassen (einschließlich
java.lang.Error
) können mit demthrows
Schlüsselwort in der Liste der Methodenausnahmen deklariert werden. Eine solche Erklärung nur erforderlich fürjava.lang.Exception
und Unterklassen, fürjava.lang.Throwable
,java.lang.Error
undjava.lang.RuntimeException
und deren Subklassen ist optional.Nur
java.lang.Throwable
und Unterklassen dürfen in dercatch
Klausel verwendet werden.Nur
java.lang.Throwable
und Unterklassen können mit dem Schlüsselwort - verwendet werdenthrow
.Die Schlussfolgerung aus dieser Eigenschaft folgt beiden
java.lang.Error
undjava.lang.Exception
kann im Methodenheader deklariert werden, kann incatch
Klausel sein, kann mit Schlüsselwort verwendet werdenthrow
.Unterschiede:
Erster konzeptioneller Unterschied:
java.lang.Error
Entwickelt, 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 anderenjava.lang.Throwable
Nachfolger möglich).Eine Passage aus der Javadoc- Beschreibung über
java.lang.Error
: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
:java.lang.Error
undjava.lang.Exception
dem ersten wird als ungeprüfte Ausnahme für die Ausnahmeprüfung zur Kompilierungszeit angesehen. Da das Auslösen des Ergebniscodesjava.lang.Error
oder seine Unterklassen diesen Fehler nicht im Methodenheader deklarieren müssen. Beim Auslösen derjava.lang.Exception
erforderlichen Deklaration im Methodenheader.Throwable und sein Nachfolgerklassendiagramm (Eigenschaften und Methoden werden weggelassen).
quelle
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.
quelle
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
quelle
Hier ist eine ziemlich gute Zusammenfassung der Java-API, was ein Fehler und eine Ausnahme darstellt:
OTOH, für Ausnahmen, sagt Java API:
quelle
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.OutOfMemoryError
tritt auf, wenn JVM nicht genügend Speicher hat oderStackOverflowError
wenn 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:
NullPointerException
Tritt 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.quelle