2017-01-26 7 views
-1

Ich mag wäre in der Lage sein, um sicher zu sagen, wenn der Compiler eine Ausnahme ohne Ausgabe wirft und wenn es ein paar Zeilen Code auszuführen geht von einer Ausnahme gefolgt.Ausnahmen und Ausgabe in Java

weiter zu meinem Punkt illustrieren, betrachten Sie den folgenden Code:

public class OverAndOver { 
    static String s = ""; 
    public static void main(String[] args) { 
    try { 
     s += "1"; 
     throw new Exception(); 
    } catch (Exception e) { s += "2"; 
    } finally { s += "3"; doStuff(); s += "4"; 
    } 
    System.out.println(s); 
    } 
    static void doStuff() { int x = 0; int y = 7/x; } 
} 

Ein kurzer Blick auf die doStuff() -Methode und Sie wissen, dass der Compiler eine Division durch Null Ausnahme ausgelöst wird.

Nun, hier ist meine Frage (und die Quelle meiner Verwirrung): Warum hat der Compiler nicht "123" gefolgt von der Ausnahme angezeigt? Und vor allem: Wie kann ich sicher sagen, wann der Compiler einige Zeilen Code ausführen wird, bevor er eine Exception auslöst und wann eine Exception ohne Ausgabe ausgegeben wird?

+2

Nebenstelle: wahrscheinlich meinst du Laufzeitumgebung, Compiler führt Ihren Code nicht aus. –

+1

Danke für die Korrektur. +1 –

Antwort

3

Warum hat der Compiler nicht "123" gefolgt von der Ausnahme angezeigt?

Zunächst führt der Compiler den Code nicht aus, daher werden diese Werte nie angezeigt.

Wenn Sie, warum Ihre Anwendung fragen, bevor die Ausnahme nicht den Text angezeigt werden, ist die Antwort, dass Sie es nicht drucken: Sie können es nur in einen String anhängen, und Sie drucken die Zeichenfolge nach der finally Block .

Der Block finally löst eine Ausnahme aus, und Ihre Druckanweisung wird nie erreicht.

versuchen, den Text direkt drucken:

public class OverAndOver { 

    public static void main(String[] args) { 
     try { 
      System.out.println("1"); 
      throw new Exception(); 
     } catch (Exception e) { 
      System.out.println("2"); 
     } finally { 
      System.out.println("3"); 
      doStuff(); 
      System.out.println("4"); 
     } 
    } 

    static void doStuff() { 
     int x = 0; 
     int y = 7/x; 
    } 
} 

Der Ausgang wird:

1 
2 
3 
Exception in thread "main" 
java.lang.ArithmeticException:/by zero 
    at com.jedisoftware.lf_delivery_tracking.OverAndOver.doStuff(App.java:74) 
    at com.jedisoftware.lf_delivery_tracking.OverAndOver.main(App.java:67) 
+0

Vielen Dank für Ihre großartige Erklärung. Ich habe versucht, deinen Beitrag als Antwort zu akzeptieren, aber es hat mir nicht erlaubt. Ich werde es später noch einmal versuchen. Nochmals vielen Dank. –

+0

Eine letzte Frage: Gibt es Ausnahmen in Java, wo die Laufzeitumgebung unabhängig von Ihrem Code nur die Ausnahme ohne Ausgabe ausgibt? –

+0

@JesseJames Java ist wie jede andere Sprache: Es macht genau das, was Sie ihm sagen. Eine Ausnahme unterbricht die Ausführung des Programms, wenn sie nicht abgefangen und bearbeitet wird, aber sie "wischt" nicht die Programmausgabe. Alles, was Sie drucken, bevor die Ausnahme gedruckt wird. – BackSlash

1

Warum nicht der angezeigte Compiler "123" und die Ausnahme?

Da System.out.println(s); Befehl ausgeführt werden nie .. Ausnahme ist in den doStuff(); Verfahren und die Durchführung der Hauptverfahren unterbrochen angehoben. Wenn Sie 123 vor Ausnahme angezeigt werden Sie die System.out.println(s); Anweisung vor dem doStuff() Methode setzen sollte wie folgt:

public class OverAndOver { 
    static String s = ""; 
    public static void main(String[] args) { 
    try { 
     s += "1"; 
     throw new Exception(); 
    } catch (Exception e) { s += "2"; 
    } finally { s += "3"; System.out.println(s); doStuff(); s += "4"; 
    } 
    } 
    static void doStuff() { int x = 0; int y = 7/x; } 
} 
1

Sie doStuff() nennen, die eine ungeprüfte Ausnahme außerhalb eines Try-Block werfen kann. Wenn Sie sowohl die Ausnahme als auch die Zeichenfolge drucken möchten, müssen Sie den Aufruf doStuff() in ein try-catch-Konstrukt umbrechen.

public class OverAndOver { 
    static String s = ""; 
    public static void main(String[] args) { 
    try { 
     s += "1"; 
     throw new Exception(); 
    } catch (Exception e) { s += "2"; 
    } finally { 
     try{ 
      s += "3"; doStuff(); s += "4"; 
     }catch(ArithmeticException e){ 
     e.printStackTrace(); 
     } 
    } 
    System.out.println(s); 
    } 
    static void doStuff() { int x = 0; int y = 7/x; } 
}