Ich dachte, ich hätte ein gutes Grundverständnis für die Behandlung von Ausnahmen in Java, aber ich habe kürzlich einen Code gelesen, der mir einige Verwirrung und Zweifel bereitete. Mein Hauptzweifel, den ich hier ansprechen möchte, ist, wann eine Person Würfe in einer Java-Methodendeklaration wie der folgenden verwenden sollte:
public void method() throws SomeException
{
// method body here
}
Beim Lesen einiger ähnlicher Beiträge erfahre ich, dass Würfe als eine Art Deklaration verwendet werden, dass SomeException während der Ausführung der Methode ausgelöst werden könnte.
Meine Verwirrung kommt von einem Code, der so aussah:
public void method() throws IOException
{
try
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
Gibt es einen Grund, warum Sie in diesem Beispiel einen Wurf verwenden möchten ? Es scheint, dass Sie, wenn Sie nur eine grundlegende Ausnahmebehandlung für etwas wie eine IOException durchführen, einfach den try / catch-Block benötigen und das war's.
quelle
throws
Schlüsselworts.Sie müssen nur dann eine throw-Klausel in eine Methode einfügen, wenn die Methode eine aktivierte Ausnahme auslöst. Wenn die Methode eine Laufzeitausnahme auslöst, ist dies nicht erforderlich.
Hier finden Sie Hintergrundinformationen zu aktivierten und nicht aktivierten Ausnahmen: http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
Wenn die Methode die Ausnahme abfängt und intern behandelt (wie in Ihrem zweiten Beispiel), muss keine throw-Klausel eingefügt werden.
quelle
Der Code, den Sie sich angesehen haben, ist nicht ideal. Sie sollten entweder:
Fangen Sie die Ausnahme ab und behandeln Sie sie. in diesem Fall
throws
ist das unnötig.Entfernen Sie die
try/catch
; In diesem Fall wird die Ausnahme von einer aufrufenden Methode behandelt.Fangen Sie die Ausnahme ab, führen Sie möglicherweise eine Aktion aus und lösen Sie die Ausnahme erneut aus (nicht nur die Nachricht).
quelle
Sie haben Recht, in diesem Beispiel
throws
ist das überflüssig. Es ist möglich, dass es von einer früheren Implementierung dort belassen wurde - vielleicht wurde die Ausnahme ursprünglich ausgelöst, anstatt im catch-Block abgefangen zu werden.quelle
In dem von Ihnen angegebenen Beispiel löst die Methode niemals eine IOException aus, daher ist die Deklaration falsch (aber gültig). Ich vermute, dass die ursprüngliche Methode die IOException ausgelöst hat, aber dann aktualisiert wurde, um die darin enthaltene Ausnahme zu behandeln, aber die Deklaration wurde nicht geändert.
quelle
Der von Ihnen gepostete Code ist falsch. Er sollte eine Ausnahme auslösen, wenn eine bestimmte Ausnahme abgefangen wird, um die IOException zu behandeln, aber keine abgefangenen Ausnahmen auslösen.
Etwas wie:
oder
}}
quelle
Dies ist keine Antwort, sondern ein Kommentar, aber ich konnte keinen Kommentar mit einem formatierten Code schreiben. Hier ist der Kommentar.
Sagen wir, es gibt
Die Ausgabe ist
Diese Methode deklariert keine "Würfe" -Ausnahmen, sondern wirft sie! Der Trick besteht darin, dass die ausgelösten Ausnahmen RuntimeExceptions (nicht aktiviert) sind, die für die Methode nicht deklariert werden müssen. Es ist ein bisschen irreführend für den Leser der Methode, da alles, was sie sieht, ein "Wurf e" ist; Anweisung, aber keine Deklaration der Throws-Ausnahme
Nun, wenn wir haben
Wir MÜSSEN die "Throws" -Ausnahmen in der Methode deklarieren, sonst erhalten wir einen Compilerfehler.
quelle
throws
erforderlich ist oder nicht .