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