Wann wirft in einer Methodendeklaration Java zu verwenden?
-
10-10-2019 - |
Frage
Also ich dachte, dass ich ein gutes Grundverständnis für Ausnahmebehandlung hatte in Java, aber ich las vor kurzem einige Code, der mir einige Verwirrung und Zweifel gab. Mein Haupt Zweifel, dass ich ansprechen möchte hier ist, wenn sollte eine Person Verwendung wirft in einer Java-Methode Erklärung wie folgt aus:
public void method() throws SomeException
{
// method body here
}
Von einigen ähnlichen Beiträgen zu lesen ich, dass sammeln wirft wird als eine Art Erklärung verwendet, dass SomeException konnte während der Durchführung des Verfahrens geworfen werden.
Meine Verwirrung von einigem Code kommt, dass 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, dass Sie ein verwenden möchten, wirft in diesem Beispiel? Es scheint, dass, wenn Sie gerade wie ein IOException grundlegende Ausnahmebehandlung von etwas tun, dass man es einfach braucht die try / catch-Block und das ist es.
Lösung
Wenn Sie eine Ausnahme Art fangen, brauchen Sie nicht, es zu werfen, es sei denn, du gehst, es erneut auslösen. Im Beispiel Sie schreiben, haben die Entwickler sollten eine oder andere getan, nicht beide.
Normalerweise, wenn Sie nicht mit der Ausnahme gehen, etwas zu tun, sollten Sie es nicht fangen.
Die gefährlichste Sache, die Sie tun können, ist eine Ausnahme fangen und nichts mit ihm tun.
Eine gute Diskussion, wenn es entsprechende Ausnahmen zu werfen ist hier
Andere Tipps
Sie müssen nur eine Klausel über eine Methode wirft aufzunehmen, wenn die Methode eine geprüfte Ausnahme auslöst. Wenn die Methode eine Laufzeitausnahme wirft dann gibt es keine Notwendigkeit, dies zu tun.
Sehen Sie hier für einige Hintergrundinformationen auf vs ungeprüften Ausnahmen geprüft: http: / /download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
Wenn die Methode die Ausnahme und befasst sich mit intern fängt (wie in Ihrem zweiten Beispiel), dann gibt es keine Notwendigkeit eine throws-Klausel aufzunehmen.
Der Code, den Sie suchen ist bei nicht ideal. Sie sollten entweder:
-
Fangen Sie die Ausnahme und damit umgehen; die
throws
in welchem ??Fall unnötig. -
Die
try/catch
; in welchem ??Fall Die Ausnahme wird durch eine hand Aufruf der Methode. -
Fangen Sie die Ausnahme, möglicherweise eine Aktion durchführen und dann erneut auslösen die Ausnahme (nicht nur die Nachricht)
Sie sind richtig, in diesem Beispiel die throws
überflüssig ist. Es ist möglich, dass es von einer früheren Implementierung dort gelassen wurde -. Vielleicht war die Ausnahme ursprünglich statt gefangen im catch-Block geworfen
Im Beispiel Sie gab, wird das Verfahren nie eine IOException werfen, damit die Erklärung falsch ist (aber gültig). Meine Vermutung ist, dass die ursprüngliche Methode wirft er die IOException, aber es wurde dann die Ausnahme behandeln aktualisiert innerhalb aber die Erklärung wurde nicht geändert.
Der Code, den Sie geschrieben ist falsch, sollte es eine Ausnahme auslösen, wenn eine spezifische Ausnahme, um Handler IOException fangen aber nicht gefangen Ausnahmen werfen.
So etwas wie:
public void method() throws Exception{
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println(e.getMessage());
}
}
oder
public void method(){
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println("Catching IOException");
System.out.println(e.getMessage());
}catch(Exception e){
System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc.");
System.out.println(e.getMessage());
}
}
Das ist keine Antwort, sondern ein Kommentar, aber ich konnte keinen Kommentar mit einem formatierten Code schreiben, so ist hier der Kommentar.
Hier kann sagen, dass es
public static void main(String[] args) {
try {
// do nothing or throw a RuntimeException
throw new RuntimeException("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
Die Ausgabe ist
test
Exception in thread "main" java.lang.RuntimeException: test
at MyClass.main(MyClass.java:10)
Diese Methode deklariert keine „wirft“ Ausnahmen, sondern wirft sie! Der Trick besteht darin, dass die ausgelöste Ausnahmen sind Runtime (nicht markiert), die nicht über die Methode deklariert werden benötigt. Es ist ein wenig für den Leser des Verfahrens irreführend, da alles, was es ist sieht „throw e;“ Erklärung, aber keine Erklärung der Würfe Ausnahme
Wenn wir jetzt haben
public static void main(String[] args) throws Exception {
try {
throw new Exception("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
Wir müssen erklären, die „werfen“ Ausnahmen in der Methode sonst wir einen Compiler-Fehler erhalten.