was ist die genaue Reihenfolge der Ausführung für versuchen, fangen und schließlich?

7

In diesem Java-Code

%Vor%

die Ausgabe, die ich erwarte, ist

%Vor%

Aber manchmal bekomme ich diese erwartete Ausgabe und zu anderen Zeiten bekomme ich die folgende Ausgabe:

%Vor%

und manchmal sogar diese Ausgabe:

%Vor%

und ob ich die erste, zweite oder dritte Ausgabe bekomme, scheint zufällig bei jeder Ausführung zu passieren. Ich habe DIESEN POST gefunden, von dem anscheinend gesprochen wird das gleiche Problem, aber ich verstehe immer noch nicht, warum ich manchmal 1, 2 oder 3 ausgib. Wenn ich diesen Code richtig verstehe, dann sollte Ausgabe 1 sein, was ich jedes Mal bekomme (die Ausnahme tritt auf). Wie stelle ich sicher, dass ich die Ausgabe 1 konsistent erhalte oder in der Lage bin, zu sagen, wann ich die Ausgabe 1 bekomme oder wann ich will Ausgabe 2 oder 3 bekommen?

    
user13267 26.07.2013, 06:14
quelle

5 Antworten

16

Das Problem ist, dass Sie eine Ausgabe in System.out und einige in System.err schreiben. Dies sind unabhängige Ströme mit unabhängiger Pufferung. Der Zeitpunkt, wann sie geleert werden, ist, soweit ich weiß, nicht spezifiziert.

Kurz gesagt: Wenn Sie in verschiedene Streams schreiben, können Sie nicht die Reihenfolge verwenden, in der die Ausgabe angezeigt wird, um die Reihenfolge zu bestimmen, in der die Aufrufe von println() aufgetreten sind. Beachten Sie, dass die Ausgabe in System.out immer in der erwarteten Reihenfolge angezeigt wird.

Bis zur Reihenfolge der Ausführung wird der Rumpf von try zuerst ausgeführt. Wenn es eine Ausnahme auslöst, wird der Rumpf der entsprechenden catch -Klausel ausgeführt. Der finally -Block wird immer zuletzt ausgeführt.

    
Ted Hopp 26.07.2013, 06:17
quelle
3

Führe zuerst Try block aus, wenn der Erfolg erfolgreich ist, wenn try block fail, dann wird catch ausgeführt und finally ausgeführt. Was auch immer passieren wird schließlich Block ausgeführt werden.

Aber

Wenn Sie System.exit(0) finally block not executed

aufrufen     
Ruchira Gayan Ranaweera 26.07.2013 06:20
quelle
2

Die Sache mit der Ausnahmebehandlung mit try catch block ist, dass das Steuerelement in try gehen wird, wenn irgendeine Ausnahme in catch block kommt. Aber das Steuerelement wird jedes Mal zum letzten Block gehen, wenn es ausgeführt wird.

    
Maclane 26.07.2013 06:17
quelle
1

Sie schreiben Ihre Fehlermeldung sowohl in stdout als auch in stderr. Sie haben unterschiedliche Puffer, daher gibt es keine Garantie, dass die Ausgabe, die Sie sehen, in der gleichen Reihenfolge ist, in der Sie sie erstellt haben, zwischen den beiden Ausgabeströmen.

Da ich in Ihrem Code keine Fehler sehen kann (obwohl die überflüssige return; in Ihrem catch -Segment in meinem Craw ein wenig stecken bleibt), lassen Sie mich vorschlagen, dass Sie alle Ihre Nachrichten in stderr schreiben und sehen, ob Die Reihenfolge der Nachrichten entspricht ein wenig mehr dem, was Sie erwartet haben.

    
Curt 26.07.2013 06:18
quelle
1

Sie haben einen Fehler in Ihrem Beispiel, den ich entfernen würde. Sie schreiben sowohl in System.out als auch in System.err und erwarten von Ihrer Konsole, dass beide Streams korrekt synchronisiert werden. Um Nebenwirkungen zu entfernen, würde ich hier nur einen Stream verwenden.

    
Matthias 26.07.2013 06:19
quelle

Tags und Links