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.

War es hilfreich?

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

Wenn eine Ausnahme ausgelöst?

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:

  1. Fangen Sie die Ausnahme und damit umgehen; die throws in welchem ??Fall unnötig.

  2. Die try/catch; in welchem ??Fall Die Ausnahme wird durch eine hand Aufruf der Methode.

  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top