Jemand bitte erklären Sie den Unterschied zwischen java.lang.RuntimeException
und java.lang.Exception
? Wie entscheide ich, welche ich erweitern möchte, wenn ich meine eigene Ausnahme erstelle?
210
Im Allgemeinen sind RuntimeExceptions Ausnahmen , die programmgesteuert verhindert werden können. ZB NullPointerException
, ArrayIndexOutOfBoundException
. Wenn Sie null
vor dem Aufrufen einer Methode nach prüfen , NullPointerException
würde dies niemals auftreten. Ähnliches ArrayIndexOutOfBoundException
würde niemals passieren, wenn Sie zuerst den Index überprüfen. RuntimeException
werden vom Compiler nicht überprüft, es handelt sich also um sauberen Code.
EDIT : Heutzutage bevorzugen RuntimeException
die Leute den sauberen Code, den er erzeugt. Es ist eine ganz persönliche Entscheidung.
RuntimeException
ist, dass es einfach ist und die Notwendigkeit beseitigt, über die Unterschiede zwischen aktivierten und nicht aktivierten Ausnahmen nachzudenken. Ich denke, dass das Abfangen von Laufzeitausnahmen eine schreckliche Idee ist, da Sie nicht behebbare Ausnahmen wie zNullPointerException
.In Java gibt es zwei Arten von Ausnahmen: geprüfte Ausnahmen und nicht geprüfte Ausnahmen. Eine geprüfte Ausnahme muss explizit vom Code behandelt werden, während eine nicht geprüfte Ausnahme nicht explizit behandelt werden muss.
Bei aktivierten Ausnahmen müssen Sie entweder einen try / catch-Block um den Code setzen, der möglicherweise die Ausnahme auslösen könnte, oder der Methode eine "throw" -Klausel hinzufügen, um anzugeben, dass die Methode möglicherweise diese Art von Ausnahme auslöst (was sein muss) in der aufrufenden Klasse oder höher behandelt).
Jede Ausnahme, die von "Ausnahme" abgeleitet ist, ist eine aktivierte Ausnahme, während eine Klasse, die von RuntimeException abgeleitet ist, nicht aktiviert ist. RuntimeExceptions müssen vom aufrufenden Code nicht explizit behandelt werden.
quelle
Bevor Sie den Unterschied zwischen
java.lang.RuntimeException
undjava.lang.Exception
Klassen betrachten, müssen Sie dieException
Hierarchie kennen. BeideException
undError
Klassen werden von der Klasse abgeleitetThrowable
(die von der Klasse abgeleitet istObject
). Und die KlasseRuntimeException
ist von der Klasse abgeleitetException
.Alle Ausnahmen werden entweder von
Exception
oder abgeleitetRuntimeException
.Alle Ausnahmen, die sich daraus
RuntimeException
ergeben, werden als ungeprüfte Ausnahmen bezeichnet. Alle anderen Ausnahmen sind geprüfte Ausnahmen. Eine aktivierte Ausnahme muss irgendwo in Ihrem Code abgefangen werden, sonst wird sie nicht kompiliert. Deshalb werden sie als geprüfte Ausnahmen bezeichnet. Andererseits ist die aufrufende Methode mit ungeprüften Ausnahmen nicht verpflichtet, sie zu behandeln oder zu deklarieren.Daher werden alle Ausnahmen, von denen der Compiler Sie zum Behandeln zwingt, direkt abgeleitet,
java.lang.Exception
und alle anderen, von denen der Compiler Sie nicht zum Behandeln zwingt, werden abgeleitetjava.lang.RuntimeException
.Im Folgenden sind einige der direkt bekannten Unterklassen von RuntimeException aufgeführt .
quelle
Eine Ausnahme ist aktiviert und eine RuntimeException ist deaktiviert.
Aktiviert bedeutet, dass der Compiler verlangt, dass Sie die Ausnahme in einem Catch behandeln oder Ihre Methode als Auslöser (oder eine ihrer Oberklassen) deklarieren.
Im Allgemeinen wird eine aktivierte Ausnahme ausgelöst, wenn vom Aufrufer der API erwartet wird, dass sie die Ausnahme behandelt, und eine nicht aktivierte Ausnahme, wenn dies normalerweise vom Aufrufer nicht behandelt werden kann, z. B. ein Fehler mit einem der Parameter, z. B. eine Programmierung Fehler.
quelle
Die Laufzeitausnahmeklassen (RuntimeException und ihre Unterklassen) sind von der Überprüfung der Kompilierungszeit ausgenommen, da der Compiler nicht feststellen kann, dass Laufzeitausnahmen nicht auftreten können. (von JLS).
In den von Ihnen entworfenen Klassen sollten Sie Exception unterordnen und Instanzen davon auslösen, um außergewöhnliche Szenarien zu signalisieren. Auf diese Weise signalisieren Sie den Clients Ihrer Klasse explizit, dass die Verwendung Ihrer Klasse möglicherweise eine Ausnahme auslöst, und sie müssen Schritte unternehmen, um diese Ausnahmeszenarien zu behandeln.
Die folgenden Codeausschnitte erläutern diesen Punkt:
In der obigen Klassendefinition der Klasse Process kann die Methode
execute
eine RuntimeException auslösen , die Methodendeklaration muss jedoch nicht angeben, dass sie RuntimeException auslöst .Die Methode löst
process
eine aktivierte Ausnahme aus und sollte deklarieren, dass eine aktivierte Ausnahme der Art MyException ausgelöst wird. Andernfalls wird ein Kompilierungsfehler angezeigt .Die obige Klassendefinition wirkt sich auch auf den Code aus, der die Prozessklasse verwendet .
Der Aufruf
new Process().execute()
ist ein gültiger Aufruf, bei dem der Aufruf der Formnew Process().process()
einen Kompilierungsfehler ergibt. Dies liegt daran, dass der Client-Code Schritte zur Behandlung ausführen sollteMyException
(z. B. kann call to process () in einen try / catch-Block eingeschlossen werden).quelle
Richtige Verwendung von RuntimeException?
Von ungeprüften Ausnahmen - Die Kontroverse :
Beachten Sie, dass eine nicht aktivierte Ausnahme von einer abgeleiteten
RuntimeException
und eine aktivierte von einer abgeleiteten Ausnahme abgeleitet istException
.Warum einen werfen,
RuntimeException
wenn ein Client nichts tun kann, um die Ausnahme zu beheben? Der Artikel erklärt:quelle
Aus der Orakel-Dokumentation:
Laufzeitausnahmen stellen Probleme dar, die das Ergebnis eines Programmierproblems sind, und daher kann nicht erwartet werden, dass der API-Clientcode diese wiederherstellt oder in irgendeiner Weise behandelt.
RuntimeExceptions sind wie "Ausnahmen durch ungültige Verwendung einer API" Beispiele für Laufzeitausnahmen: IllegalStateException, NegativeArraySizeException, NullpointerException
Mit den Ausnahmen müssen Sie es explizit abfangen, da Sie noch etwas tun können, um sich zu erholen. Beispiele für Ausnahmen sind: IOException, TimeoutException, PrintException ...
quelle
In einfachen Worten, wenn Ihr Kunde / Benutzer aus dem Exception wiederherstellen kann dann macht es zu einer überprüft Ausnahme , wenn Ihr Kunde nichts von der Ausnahme erholen tun kann , dann macht es Ungeprüfter Runtime . Beispielsweise wäre eine RuntimeException ein programmatischer Fehler, wie die Division durch Null. Kein Benutzer kann etwas dagegen tun, außer der Programmierer selbst. Dann handelt es sich um eine RuntimeException .
quelle
RuntimeException ist eine untergeordnete Klasse der Exception-Klasse
Dies ist eine der vielen untergeordneten Klassen der Ausnahmeklasse. RuntimeException ist die Oberklasse der Ausnahmen, die während des normalen Betriebs der Java Virtual Machine ausgelöst werden können. Eine Methode muss in ihrer throw-Klausel keine Unterklassen von RuntimeException deklarieren, die möglicherweise während der Ausführung der Methode ausgelöst, aber nicht abgefangen werden.
Die Hierarchie ist
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
quelle
Ausnahmen sind eine gute Möglichkeit, um unerwartete Ereignisse in Ihrem Anwendungsfluss zu behandeln. RuntimeException wird vom Compiler deaktiviert. Möglicherweise bevorzugen Sie jedoch die Verwendung von Ausnahmen, die die Ausnahmeklasse erweitern, um das Verhalten Ihrer API-Clients zu steuern, da diese Fehler abfangen müssen, damit sie kompiliert werden können. Bildet auch eine gute Dokumentation.
Wenn Sie eine saubere Schnittstelle erreichen möchten, verwenden Sie die Vererbung, um die verschiedenen Ausnahmetypen Ihrer Anwendung zu unterklassifizieren und dann die übergeordnete Ausnahme verfügbar zu machen.
quelle
Es gibt zwei Arten von Ausnahmen: Sie können eine aktivierte Ausnahme wiederherstellen, wenn Sie eine solche Ausnahme erhalten. Laufzeitausnahmen sind nicht behebbar, Laufzeitausnahmen sind Programmierfehler, und der Programmierer sollte sich beim Schreiben des Codes darum kümmern. Wenn Sie die Ausführung fortsetzen, erhalten Sie möglicherweise ein falsches Ergebnis. Bei Laufzeitausnahmen geht es um die Verletzung der Vorbedingung ex. Wenn Sie ein Array der Größe 10 haben und versuchen, auf das 11. Element zuzugreifen, wird ArrayIndexOutOfBoundException ausgelöst
quelle
Benutzerdefinierte Ausnahmen können "Checked Exception" oder "Unchecked Exception" sein. Dies hängt von der Klasse ab, auf die sie erweitert werden.
Benutzerdefinierte Ausnahmen können benutzerdefinierte geprüfte Ausnahmen sein, wenn sie sich auf die Ausnahmeklasse erstrecken
Benutzerdefinierte Ausnahmen können benutzerdefinierte nicht aktivierte Ausnahmen sein, wenn sie sich auf die Laufzeitausnahmeklasse erstrecken.
Definieren Sie eine Klasse und machen Sie sie zu einem Kind der Ausnahme oder der Laufzeitausnahme
quelle