3 Stimmen

Wie funktioniert throw new exception innerhalb eines Catch-Blocks?

Ich habe ein Snippet wie folgt:

try
{
   //blah!!
} 
catch(IOException e)
{
   throw new RuntimeException(e);
}

Ich verstehe nicht, wie das obige funktioniert? Wird es eine IOException catch und wenn ja, wird es dann eine RuntimeException throw? In diesem Fall wird die IOException keine Bedeutung haben, richtig? Ein Beispiel würde helfen.

2voto

axcdnt Punkte 13214

Du hast recht mit einigen Annahmen, aber du solltest etwas tiefer gehen. Innerhalb deines try Blocks, stell dir vor, eines deiner Methoden deiner Klasse wirft eine solche Ausnahme IOException. Also dient das Fangen als Möglichkeit, diesen Ausnahmefall zu behandeln. Im Grunde genommen ist es so. Wenn du einfach deine Ausnahme weg wirfst, indem du eine RuntimeException verwendest, aber wie du es gemacht hast, deine IOException in RuntimeException einpackst, wirst du sie überhaupt nicht verlieren.

Ein normaler Gebrauch ist es, auf einer höheren Ebene deine Ausnahme zu behandeln. Hier ist ein gutes Tutorial zum Thema Fehlerbehandlung, bitte schau nach: Best Practices für Fehlerbehandlung

1voto

Reimeus Punkte 155767

In diesem Code wird die überprüfte IOException effektiv zu einer nicht überprüften Exception. Indem Sie die IOException an die RuntimeException übergeben, verknüpfen Sie die beiden miteinander.

1voto

kosa Punkte 65422

Ja, Ihr Verständnis ist korrekt. Dies kann nützlich sein, wenn Sie anwendungsspezifische Ausnahmen anzeigen möchten, anstelle von den von Java bereitgestellten Ausnahmen (IOException ist möglicherweise kein perfekter Fall, um dies zu verstehen).

1voto

Garrett Hall Punkte 28608

Überprüfte Ausnahmen müssen eingefangen oder als geworfen deklariert werden. RuntimeExceptions nicht, daher ist das Einfangen und Erneutes Werfen als RuntimeException eine Möglichkeit, um nicht deklarieren zu müssen:

public void meineMethode() wirft IOException

Wenn throw new RuntimeException(e); aufgerufen wird, wird eine neue Ausnahme erstellt und geworfen, aber die ursprüngliche Ausnahme wird darin umschlossen. Daher wird der Stapelverfolgungsfehler folgendermaßen aussehen:

Ausnahme in Thread "main" java.lang.RuntimeException: java.io.IOException: Ein Fehler ist aufgetreten.
    bei com...main(EinigeKlasse.java:36)
Verursacht durch: java.io.IOException: Ein Fehler ist aufgetreten.

Die tatsächliche Ausnahme, die den Aufrufstapel hochgeht, war eine RuntimeException, aber das ursprüngliche IOException wird in der Nachricht als Ursache beibehalten.

1voto

templatetypedef Punkte 343693

Ihr Verständnis ist korrekt. Wenn eine IOException geworfen wird, wird der catch-Handler sie abfangen und sofort seine eigene RuntimeException werfen. Diese Ausnahme kann an anderer Stelle im Programm abgefangen werden, in diesem Fall wird die Kontrolle beim Handler aufgenommen, oder sie bleibt unerfasst und beendet den aktuellen Thread.

Ein Weg, um zu verstehen, was hier passiert, ist folgender - eine IOException ist eine geprüfte Ausnahme, was bedeutet, dass sie abgefangen werden muss. Wenn sie nicht abgefangen wird, wird das Programm nicht kompiliert. Der obige Code besagt, dass immer wenn eine IOException abgefangen wird, eine RuntimeException geworfen wird, die eine ungeprüfte Ausnahme ist. Diese Ausnahme muss nicht vom Programmierer abgefangen werden. Beachten Sie, dass diese RuntimeException mit der gefangenen IOException als Parameter konstruiert wird. Dies bedeutet, dass wenn die RuntimeException später abgefangen wird, derjenige, der sie abfängt, feststellen kann, dass der zugrundeliegende Grund eine IOException war und entsprechend damit umgehen kann.

Hoffentlich hilft Ihnen das!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X