it-swarm.com.de

Unterschied zwischen Java.lang.RuntimeException und Java.lang.Exception

Erklären Sie bitte den Unterschied zwischen Java.lang.RuntimeException und Java.lang.Exception? Wie entscheide ich mich für die Erweiterung, wenn ich meine eigene Ausnahme erstellen möchte?

172
cchampion

Im Allgemeinen RuntimeExceptions sind Ausnahmen die programmgesteuert verhindert werden können. ZB NullPointerException, ArrayIndexOutOfBoundException. Wenn Sie vor dem Aufruf einer Methode nach null suchen, würde NullPointerException niemals vorkommen. Ähnlich würde ArrayIndexOutOfBoundException niemals vorkommen, wenn Sie den Index zuerst überprüfen. RuntimeException werden vom Compiler nicht geprüft, es handelt sich also um sauberen Code.

EDIT: Heutzutage bevorzugen Leute RuntimeException, weil der von ihnen erzeugte saubere Code. Es ist eine ganz persönliche Entscheidung.

143
fastcodejava

In Java gibt es zwei Arten von Ausnahmen: geprüfte Ausnahmen und ungeprüfte Ausnahmen. Eine geprüfte Ausnahme muss vom Code explizit behandelt werden, während eine nicht geprüfte Ausnahme nicht explizit behandelt werden muss.

Für geprüfte Ausnahmen müssen Sie entweder einen try/catch-Block um den Code legen, der möglicherweise die Ausnahme auslösen könnte, oder der Methode eine "throws" -Klausel hinzufügen, um anzuzeigen, dass die Methode diesen Typ von Ausnahme auslösen kann in der aufrufenden Klasse oder höher behandelt werden).

Jede Ausnahme, die von "Ausnahme" abgeleitet ist, ist eine geprüfte Ausnahme, während eine Klasse, die von RuntimeException abgeleitet ist, nicht geprüft wird. RuntimeExceptions müssen vom aufrufenden Code nicht explizit behandelt werden.

155
Andy White

Bevor Sie den Unterschied zwischen Java.lang.RuntimeException- und Java.lang.Exception-Klassen betrachten, müssen Sie die Hierarchie Exception kennen. Beide Exception- und Error-Klassen sind von der Klasse Throwable abgeleitet (die von der Klasse Object abgeleitet ist). Und die Klasse RuntimeException ist von der Klasse Exception abgeleitet.

Alle Ausnahmen werden entweder von Exception oder RuntimeException abgeleitet.

Alle Ausnahmen, die von RuntimeException abgeleitet sind, werden als nicht angehakt -Ausnahmen bezeichnet. Und alle anderen Ausnahmen sind geprüft Ausnahmen. Eine geprüfte Ausnahme muss sich irgendwo in Ihrem Code befinden, andernfalls wird sie nicht kompiliert. Deshalb werden sie geprüfte Ausnahmen genannt. Auf der anderen Seite ist die aufrufende Methode mit ungeprüften Ausnahmen nicht verpflichtet, sie zu behandeln oder zu deklarieren. 

Daher werden alle Ausnahmen, die der Compiler zur Verarbeitung zwingt, direkt von Java.lang.Exception abgeleitet, und alle anderen Ausnahmen, die der Compiler nicht zwingt, sind die Anweisungen von Java.lang.RuntimeException.

Nachfolgend sind einige der direkt bekannten Unterklassen von RuntimeException aufgeführt. 

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 
77
GAJJE82

Eine Ausnahme wird geprüft und eine RuntimeException ist nicht markiert.

Aktiviert bedeutet, dass der Compiler verlangt, dass Sie die Ausnahme in einem catch behandeln oder Ihre Methode als auslösend deklarieren (oder eine ihrer Superklassen).

Lassen Sie im Allgemeinen eine geprüfte Ausnahme auslösen, wenn erwartet wird, dass der Aufrufer der API die Ausnahme behandelt, und eine ungeprüfte Ausnahme, wenn der Aufrufer normalerweise nicht in der Lage ist, z. B. einen Fehler mit einem der Parameter, z. B. einer Programmierung Fehler.

39
Lawrence Dol

Die Laufzeitausnahmeklassen (RuntimeException und ihre Unterklassen) sind von der Überprüfung der Kompilierungszeit ausgenommen, da der Compiler nicht feststellen kann, dass keine Laufzeitausnahmen auftreten können. (von JLS).

In den Klassen, die Sie entwerfen, sollten Sie eine Unterklasse erstellen Ausnahme und werfen Sie Instanzen vonit, um außergewöhnliche Szenarien zu signalisieren. Wenn Sie dies tun, signalisieren Sie den -Clients Ihrer Klasse explizit, dass die Verwendung Ihrer Klasse möglicherweise eine Ausnahme auslöst, und dass sie Schritte unternehmen müssen, um diese Ausnahmeszenarien zu behandeln. 

Die folgenden Codeausschnitte erläutern diesen Punkt: 

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

In der obigen Klassendefinition der Klasse Verarbeitenkann die Methode execute werfen a RuntimeException Die Methodendeklaration muss jedoch nicht angeben, dass sie auslöst RuntimeException.

Die Methode process löst eine geprüfte Ausnahme aus und sollte angeben, dass Eine geprüfte Ausnahme der Art auslöst MyException Andernfalls wird __ ein Kompilierungsfehler ausgegeben.

Die obige Klassendefinition wirkt sich auf den verwendeten Code aus Verarbeiten Klasse auch.

Der Aufruf new Process().execute() ist ein gültiger Aufruf, bei dem als Aufruf von form new Process().process() ein Kompilierungsfehler ausgegeben wird. Dies liegt daran, dass der Clientcode Schritte ausführen sollte, um MyException zu behandeln (beispielsweise kann der Aufruf von process () in Einen try/catch-Block eingeschlossen werden).

15
sateesh

Ordnungsgemäße Verwendung von RuntimeException?

Aus Ungeprüfte Ausnahmen - Die Kontroverse :

Wenn ein Kunde vernünftigerweise erwartet werden kann Um eine Ausnahme zu beheben, machen Sie es eine geprüfte Ausnahme. Wenn ein Kunde kann nichts tun, um sich von .__ zu erholen. Ausnahme, machen Sie es als ungeprüft Ausnahme.

Beachten Sie, dass eine ungeprüfte Ausnahme von RuntimeException und eine geprüfte Ausnahme von Exception abgeleitet ist.

Warum eine RuntimeException werfen, wenn ein Client keine Maßnahmen zur Wiederherstellung der Ausnahme ausführt? Der Artikel erklärt:

Laufzeitausnahmen stellen Probleme dar das sind das Ergebnis einer Programmierung Problem und somit der API-Client Code kann vernünftigerweise nicht erwartet werden erholen Sie sich von ihnen oder behandeln Sie sie in sowieso. Zu diesen Problemen zählen arithmetische Ausnahmen, wie durch null teilen; Zeigerausnahmen, B. versuchen, auf ein Objekt zuzugreifen durch eine Nullreferenz; und Indizierung Ausnahmen, wie der Versuch, Zugriff auf ein Array-Element über eine Index, der zu groß oder zu klein ist.

9
Mahdi Esmaeili

Aus der Oracle-Dokumentation:

Hier ist die unterste Zeile Richtlinie: Wenn ein Client vernünftigerweise sein kann Wird erwartet, dass sie sich von einer Ausnahme erholen, machen Sie sie zu einer geprüften Ausnahme. Ob Ein Client kann nichts von der Ausnahme wiederherstellen, sondern als ungeprüfte Ausnahme.

Laufzeitausnahmen stellen Probleme dar, die das Ergebnis eines -Programmierproblems sind und daher kann nicht erwartet werden, dass der API-Client-Code sich von ihnen erholt oder auf irgendeine Weise behandelt.

RuntimeExceptions sind wie "Ausnahmen durch ungültige Verwendung einer API". Beispiele für Laufzeitausnahmen: IllegalStateException, NegativeArraySizeException, NullpointerException 

Mit den Exceptions müssen Sie es explizit fangen, da Sie immer noch etwas tun können, um es wiederherzustellen. Beispiele für Ausnahmen sind: IOException, TimeoutException, PrintException ...

4
iberck

In einfachen Worten, wenn Ihr Client/Benutzer die Exception wiederherstellen kann, dann machen Sie daraus eine markiertException. Wenn Ihr Client nichts aus der Exception erholen kann, dann machen Sie ihn Nicht markiertRuntimeException. Zum Beispiel wäre eine RuntimeException ein programmatischer Fehler, z. B. Division durch Null. Kein Benutzer kann dagegen etwas anderes tun als den Programmierer selbst. Dann handelt es sich um eine RuntimeException.

4
Joe Almore

RuntimeException ist eine untergeordnete Klasse der Exception-Klasse

Dies ist eine der vielen untergeordneten Klassen der Exception-Klasse. RuntimeException ist die Oberklasse dieser Ausnahmen, die während des normalen Betriebs der Java Virtual Machine ausgelöst werden können. Es ist nicht erforderlich, dass eine Methode in ihrer Throws-Klausel alle Unterklassen von RuntimeException deklariert, die möglicherweise während der Ausführung der Methode ausgelöst, aber nicht abgefangen werden.

Die Hierchy ist

Java.lang.Object

--- Java.lang.Throwable

------- Java.lang.Exception

------------- Java.lang.RuntimeException

3
jayrhd

Ausnahmen sind eine gute Möglichkeit, unerwartete Ereignisse in Ihrem Anwendungsfluss zu behandeln. RuntimeException wird vom Compiler nicht geprüft, Sie können jedoch die Verwendung von Exceptions vorziehen, um die Exception-Klasse zu erweitern, um das Verhalten Ihrer API-Clients zu steuern, da diese zum Kompilieren von Fehlern erforderlich sind. Bildet auch eine gute Dokumentation. 

Wenn Sie eine saubere Schnittstelle erreichen möchten, verwenden Sie Vererbung, um die verschiedenen Ausnahmetypen, die Ihre Anwendung hat, zu untergliedern, und machen Sie dann die übergeordnete Ausnahme verfügbar.

0
F.O.O

Es gibt zwei Arten von Ausnahmen: Sie können eine überprüfte Ausnahme wiederherstellen, wenn Sie eine solche Ausnahme erhalten. Laufzeitausnahmen sind nicht wiederherstellbar, Laufzeitausnahmen sind Programmierfehler, und der Programmierer sollte sich beim Schreiben des Codes darum kümmern, und die Ausführung dieses Befehls kann zu falschen Ergebnissen führen. Laufzeitausnahmen betreffen den Verstoß gegen Vorbedingung ex. Wenn Sie ein Array der Größe 10 haben und versuchen, auf das 11. Element zuzugreifen, wird ArrayIndexOutOfBoundException ausgelöst

0
Bhagwati Malav
  1. Benutzerdefinierte Ausnahmebedingungen können geprüfte Ausnahmen oder ungeprüfte Ausnahmen sein. Sie hängen von der Klasse ab, auf die sie erweitert wird.

  2. Benutzerdefinierte Ausnahmen können benutzerdefinierte geprüfte Ausnahmen sein, wenn sie sich auf die Exception-Klasse erstrecken

  3. Benutzerdefinierte Ausnahmen können benutzerdefinierte Ungeprüfte Ausnahmen sein, wenn sie sich auf die Laufzeitausnahmeklasse erstrecken.

  4. Definieren Sie eine Klasse und machen Sie sie zu einer Ausnahme mit Ausnahme oder Laufzeitausnahme

0
Aditya