Ich habe eine sehr einfache Frage über das erneute Auslösen einer Ausnahme in Java.
Hier ist das Code-Snippet:
%Vor% Warum müssen wir ex
in der ersten Version neu werfen, während die zweite Version eleganter aussieht? Was sind die Vorteile und welche Version wird gegenüber der anderen bevorzugt?
Sie haben Recht. Zweite Version ist besser. Außerdem macht die erste Version keinen Sinn. Es tut das gleiche, außer dass die Stapelverfolgung der Ausnahme "falsch" ist.
Es gibt folgende Gründe, Ausnahmen zu "werfen":
Beispiel:
%Vor% Im obigen Beispiel hat das erneute Werfen von Exception
keinen Sinn.
Dies kann nützlich sein, wenn die Methode, die die Exception abfängt und dann erneut auslöst, zusätzliche Maßnahmen ergreifen muss, wenn sie Exception
sieht, und wünscht außerdem, dass die Exception
weitergegeben wird an den Aufrufer, damit der Aufrufer das Exception
sehen und auch etwas unternehmen kann.
Die Frage ist, warum Sie denken, dass Sie die Ausnahme erneut auslösen müssen. Hat Eclipse eine Umgebung mit try-catch
vorgeschlagen? In der Praxis wiederholen wir selten die gleiche Ausnahme, aber sehr oft fangen wir eine und werfen eine andere, die umschließt die erste, besonders wenn die Wrapper-Ausnahme nicht aktiviert ist. Dies geschieht immer dann, wenn Sie Aufrufe haben, die eine überprüfte Ausnahme deklarieren, aber die Methode, in die Sie diese Aufrufe schreiben, deklariert diese Ausnahmen nicht:
Der Ablauf der Ausführung stoppt unmittelbar nach der throw
-Anweisung; Alle nachfolgenden Anweisungen werden nicht ausgeführt. Der nächste umschließende try
-Baustein wird überprüft, um festzustellen, ob eine catch
-Anweisung vorhanden ist, die dem Typ der Ausnahme entspricht.
Wenn eine Übereinstimmung gefunden wird, wird die Kontrolle an diese Anweisung übergeben. Wenn nicht, wird die nächste einschließende try
-Anweisung überprüft und so weiter. Wenn kein übereinstimmender catch
gefunden wird, hält der standardmäßige Ausnahmebehandler das Programm an und druckt den Stapel-Trace.
Wenn die Methode in der Lage ist, eine Ausnahme zu verursachen, die sie nicht behandelt, muss sie dieses Verhalten angeben, damit sich Anrufer der Methode vor dieser Ausnahme schützen können.
Dazu können Sie eine throws
-Klausel in die Deklaration der Methode einfügen. Eine throws
-Klausel listet die Arten von Ausnahmen auf, die eine Methode auslösen könnte. Dies ist für alle Ausnahmen erforderlich, außer für solche vom Typ Error
oder RuntimeException
oder einer ihrer Unterklassen. Alle anderen Ausnahmen, die eine Methode auslösen kann, müssen in der throws
-Klausel deklariert sein. Wenn dies nicht der Fall ist, wird ein Fehler bei der Kompilierung auftreten.
Beide Versionen geben den gleichen Stacktrace aus
gibt
aus %Vor%wird genauso ausgegeben wie vorher
%Vor%Es empfiehlt sich, eigene Ausnahmen zu erstellen. wrap die Ausnahme, die Sie gerade gefangen haben, wenn Sie Details der Grundursache angeben möchten (möglicherweise wollte oder wollte nicht)
%Vor%Sie können das Problem auf oberster Ebene (mein Prozess wurde nicht abgeschlossen) und die zugrunde liegende Ursache (Datei java.pdf nicht gefunden) deutlich sehen
%Vor%Tags und Links java exception-handling exception