-
Handelt es sich dabei um eine kontrollierte Ausnahme? Nein Die Tatsache, dass Sie eine Ausnahme behandeln, macht sie nicht zu einer Checked Exception
wenn es sich um eine RuntimeException
.
-
Ist RuntimeException
eine unchecked exception
? Ja
Checked Exceptions
sind subclasses
de java.lang.Exception
Unchecked Exceptions
sind subclasses
de java.lang.RuntimeException
Aufrufe, die geprüfte Ausnahmen auslösen, müssen in einen try{}-Block eingeschlossen werden oder auf einer höheren Ebene im Aufrufer der Methode behandelt werden. In diesem Fall muss die aktuelle Methode erklären, dass sie diese Ausnahmen auslöst, damit die Aufrufer geeignete Vorkehrungen zur Behandlung der Ausnahme treffen können.
Ich hoffe, das hilft.
F: Soll ich die exakte Ausnahme aufblasen oder sie mit Exception maskieren?
A: Ja, das ist eine sehr gute Frage und eine wichtige Designüberlegung. Die Klasse Exception ist eine sehr allgemeine Ausnahmeklasse und kann verwendet werden, um interne Ausnahmen auf niedriger Ebene zu verpacken. Es ist besser, eine benutzerdefinierte Ausnahme zu erstellen und darin zu verpacken. Aber, und das ist ein wichtiger Punkt, man darf niemals die zugrundeliegende Ursache verdecken. Zum Beispiel, Don't ever
Folgendes tun -
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException("Cannot login!!"); //<-- Eat away original root cause, thus obscuring underlying problem.
}
Tun Sie stattdessen Folgendes:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException(sqle); //<-- Wrap original exception to pass on root cause upstairs!.
}
Das Aufspüren der ursprünglichen Ursache vergräbt die eigentliche Ursache, die nicht wiederhergestellt werden kann, und ist ein Alptraum für die Support-Teams, die nur Zugang zu Anwendungsprotokollen und Fehlermeldungen haben. Letzteres ist zwar besser, wird aber von vielen Leuten nicht genutzt, weil die Entwickler es einfach versäumen, die zugrunde liegende Meldung an den Aufrufer weiterzugeben. Merken Sie sich das also gut: Always pass on the actual exception
zurück, unabhängig davon, ob sie in eine anwendungsspezifische Ausnahme eingeschlossen sind oder nicht.
Zum Try-Catching RuntimeExceptions
RuntimeException
s sollten in der Regel nicht mit try-catched werden. Sie signalisieren im Allgemeinen einen Programmierfehler und sollten in Ruhe gelassen werden. Stattdessen sollte der Programmierer die Fehlerbedingung prüfen, bevor er einen Code aufruft, der zu einem Fehler führen könnte. RuntimeException
. Zum Beispiel:
try {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welcome to my site!);
} catch (NullPointerException npe) {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Dies ist eine schlechte Programmierpraxis. Stattdessen hätte eine Null-Prüfung durchgeführt werden müssen wie -
if (userObject != null) {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welome to my site!);
} else {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Es gibt jedoch Fälle, in denen eine solche Fehlerprüfung teuer ist, wie z. B. bei der Formatierung von Zahlen, wie hier -
try {
String userAge = (String)request.getParameter("age");
userObject.setAge(Integer.parseInt(strUserAge));
} catch (NumberFormatException npe) {
sendError("Sorry, Age is supposed to be an Integer. Please try again.");
}
Hier lohnt sich die Fehlerprüfung vor dem Aufruf nicht, da sie im Wesentlichen bedeutet, dass der gesamte Code für die Umwandlung von Zeichenketten in Ganzzahlen in der parseInt()-Methode dupliziert werden muss - und fehleranfällig ist, wenn sie von einem Entwickler implementiert wird. Daher ist es besser, einfach auf try-catch zu verzichten.
Also NullPointerException
y NumberFormatException
sind beide RuntimeExceptions
und fängt eine NullPointerException
sollte durch eine anmutige Null-Prüfung ersetzt werden, während ich empfehle, eine NumberFormatException
ausdrücklich, um die Einführung von fehleranfälligem Code zu vermeiden.
8 Stimmen
Ich habe ein gutes Beispiel für eine ungeprüfte Ausnahme. Ich habe eine
DataSeries
Klasse, die Daten enthält, die immer in zeitlicher Reihenfolge bleiben müssen. Es gibt eine Methode zum Hinzufügen einer neuenDataPoint
an das Ende einerDataSeries
. Wenn mein gesamter Code im gesamten Projekt korrekt funktioniert, ist eineDataPoint
sollte niemals an das Ende angefügt werden, das ein älteres Datum als das bereits vorhandene hat. Jedes Modul im gesamten Projekt ist nach dieser Binsenweisheit aufgebaut. Ich überprüfe jedoch diese Bedingung und werfe eine ungeprüfte Ausnahme, wenn sie eintritt. Und warum? Wenn es passiert, möchte ich wissen, wer das macht, und es beheben.3 Stimmen
Um noch mehr Verwirrung zu stiften. Viele Leute haben vor ~10 Jahren geprüfte Ausnahmen befürwortet, aber die Ansicht geht heute mehr und mehr in Richtung "geprüfte Ausnahmen sind schlecht". (Ich stimme dem allerdings nicht zu)
0 Stimmen
Verwandt: techblog.bozho.net/?p=316
12 Stimmen
Es ist nur dann sinnvoll, eine Exception zu behandeln, wenn Sie etwas Nützliches damit zu tun haben, andernfalls sollten Sie sie dem Aufrufer überlassen. Es zu protokollieren und so zu tun, als wäre es nicht passiert, ist normalerweise nicht sinnvoll. Sie einfach wieder auszulösen ist sinnlos. Das Verpacken in eine RuntimeException ist nicht so nützlich, wie manche denken, es führt nur dazu, dass der Compiler aufhört, Ihnen zu helfen. (IMHO)
52 Stimmen
Wir sollten aufhören, die umfassend irreführenden Begriffe von angekreuzt/unangekreuzt Ausnahmen. Sie sollten aufgerufen werden Kontrolle erforderlich gegen check-not-mandated Ausnahmen.
3 Stimmen
Ich habe auch abt ur 5. Punkt public void method_name throws Exception{} warum einige Leute tun, dass gedacht?
0 Stimmen
Ein ausgezeichneter Artikel zu diesem Thema: weblogs.java.net/blog/carcassi/archive/2009/09/25/
0 Stimmen
FileNotFoundException ist eine geprüfte Ausnahme und keine ungeprüfte Ausnahme, wie Sie in Q2 durch das Posten eines Codes erwähnt haben
0 Stimmen
Das steht in der Java-Dokumentation: docs.oracle.com/javase/tutorial/essential/exceptions/
0 Stimmen
@BlessedGeek. Ich denke, die Terminologie geprüfte/ungeprüfte Ausnahmen macht durchaus Sinn. Der Compiler ist derjenige, der prüft, ob es eine Möglichkeit für eine Ausnahme gibt.
0 Stimmen
Der Link von Duncan Jones ist tot, hier ist ein funktionierender Link: community.oracle.com/blogs/carcassi/2009/09/25/