Ich versuche, mehr über grundlegendes Java und die verschiedenen Arten von Throwables zu erfahren. Kann mir jemand die Unterschiede zwischen Ausnahmen und Fehlern mitteilen?
Ich versuche, mehr über grundlegendes Java und die verschiedenen Arten von Throwables zu erfahren. Kann mir jemand die Unterschiede zwischen Ausnahmen und Fehlern mitteilen?
Antworten:
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
...Diese Folie mit der Ausnahmehierarchie von Java von @ georgios-gousios erläutert kurz die Unterschiede zwischen Fehlern und Ausnahmen in Java.
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.
Fehler -
Error
s in Java sind vom Typ java.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
Exception
s in Java sind vom Typ java.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
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
Lesen Sie weiter: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
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.
Die Beschreibung der Error
Klasse ist ganz klar:
An
Error
ist eine UnterklasseThrowable
, die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte. Die meisten dieser Fehler sind abnormale Zustände. DerThreadDeath
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 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.
Es gibt verschiedene Ähnlichkeiten und Unterschiede zwischen Klassen java.lang.Exception
und java.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 dem throws
Schlüsselwort in der Liste der Methodenausnahmen deklariert werden. Eine solche Erklärung nur erforderlich für java.lang.Exception
und Unterklassen, für java.lang.Throwable
, java.lang.Error
und java.lang.RuntimeException
und deren Subklassen ist optional.
Nur java.lang.Throwable
und Unterklassen dürfen in der catch
Klausel verwendet werden.
Nur java.lang.Throwable
und Unterklassen können mit dem Schlüsselwort - verwendet werden throw
.
Die Schlussfolgerung aus dieser Eigenschaft folgt beiden java.lang.Error
und java.lang.Exception
kann im Methodenheader deklariert werden, kann in catch
Klausel sein, kann mit Schlüsselwort verwendet werden throw
.
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 anderen java.lang.Throwable
Nachfolger 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.
java.lang.Error
und java.lang.Exception
dem ersten wird als ungeprüfte Ausnahme für die Ausnahmeprüfung zur Kompilierungszeit angesehen. Da das Auslösen des Ergebniscodes java.lang.Error
oder seine Unterklassen diesen Fehler nicht im Methodenheader deklarieren müssen. Beim Auslösen der java.lang.Exception
erforderlichen Deklaration im Methodenheader.Throwable und sein Nachfolgerklassendiagramm (Eigenschaften und Methoden werden weggelassen).
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.
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.
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.
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 oder
StackOverflowError
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.
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/… .