Ausgabe in falscher Reihenfolge

MichaelTT

Mitglied
Hallo liebes Board,

da dies mein erster Beitrag ist, lasst mich kurz vorstellig werden: mein Name ist Michael, ich bin 22 Jahre alt und studiere Elektrotechnik im 3. Semester. Nun steht auf meinem Stundenplan unter anderem das Fach Java. Die Klausur habe ich bereits hinter mir, die lief wirklich super und ich wage zu behaupten, dass ich aus den Vorlesungen doch einiges mitgenommen habe. Auf Raten meines Profs nutze ich diese (Link) Java-Version, diese habe ich sogar eben nochmal neu installiert.

Trotz allem treibt mich meine Java-VM zur Verzweiflung. Meistens sitzen die Fehler vor dem Bildschirm und ich wäre froh, wenn ihr mich in dieser Hinsicht bestätigen könntet ;-).

In der Java-Klasse "Bruchfinder" (ist ein Tool) befindet sich eine main-Methode, die auch ausgeführt wird. Direkt in der main-Methode kommt es dann zu folgendem Aufruf:

Code:
if (activated == false){
            System.err.println("Sie nutzen weiterhin die Testversion.");
        }
        
        double soll = 1, ist;
        int a = 1, b = 1, cnt = 0;
        System.out.println("TEST");
        
if (activated == true){
            ...<mehr Code>
        }

Das Programm läuft ganz normal ab, immer erscheint in der Ausgabe die Zeile "TEST" vor (!) der Zeile mit dem "Sie nutzen weiterhin die Testversion", obwohls im Code ja umgekehrt ist. Das Phönomen ist mir bereits öfter aufgefallen: manche Ausgaben (wie diese) erscheinen immer falsch herum, andere dagegen nur beim ersten Aufruf. Beim zweiten Ausführen der main-Methode läuft alles ganz normal.

Kennt jemand von euch dieses Phänomen? Hat das was mit den verschiedenen Kanälen "out" und "err" zu tun? Verwende ich vielleicht eine ungeeignete Java-Version?

Verzweifelte Grüße,
Michael
 
Das hier könnte man eleganter lösen,

Java:
if (activated == false){
            System.err.println("Sie nutzen weiterhin die Testversion.");
        }
        
        double soll = 1, ist;
        int a = 1, b = 1, cnt = 0;
        System.out.println("TEST");
        
if (activated == true){
            ...<mehr Code>
        }

und zwar so :

Java:
boolean activated = false;
		
		if (!activated){
            System.err.println("Sie nutzen weiterhin die Testversion.");
        }
		else{
			System.out.println("Sie haben erfolgreich eine Vollversion erworben");
		}

außerdem ist das hier nicht genutzter Code

Java:
  double soll = 1, ist;
        int a = 1, b = 1, cnt = 0;
     //    System.out.println("TEST");


Die Frage die sich stellt ist nun was genau soll denn Passieren 🙂 ?

ZU deinem Problem mit der Ausgabe, das liegt auch daran wie genau du deinen boolschen Wert initialisiert hast.
 
Zuletzt bearbeitet:
Nein, das Problem bei der Ausgabe sind tatsächlich die verschiedenen Ausgabestreams, die beide unabhängig voneinander, und zwar dann, wenn sie lustig sind, in die Konsole schreiben.
Mit einem Aufruf von
Code:
.flush()
erzwingst du, dass "sofort" in die Konsole geschrieben wird, aber selbst damit kannst du nicht 100% garantieren, wer gewinnt, sprich wer schneller schreibt...
 
Zuletzt bearbeitet:
Da muss stg recht, nun sehe ich auch was genau du mit "in falscher Reihenfolge" meintest.

eleganter lösen könnte man es trotzdem 😛
 
Danke für die Antwort,


das hatte ich vergessen zu erwähnen. "activated" wird zu Beginn auf "false" gesetzt und (bei einer gewissen Bedingung) auf "true" umgesetzt. Im Beispielcode ist aber davon auszugehen, dass immer noch "false" eingetragen ist. Der nicht genutzte Code wird dann weiter unten in meinem Programm nötig (doch das hat ja mit der Ausgabe nichts mehr zu tun).

Du hast Recht, es lässt sich eleganter lösen - aber hat mein Code denn einen Haken, der dazu führen könnte, dass die Ausgabe in der falschen Reihenfolge erfolgt?

Das Programm macht ja etwas (in Codefragmenten, die ich jetzt nicht kopiert habe). Mir gehts nur um die Reihenfolge der Ausgabe, die ich nicht verstehe. Falls du mehr (oder auch das ganze Programm) haben möchtest, kann ich auch das gerne posten 🙂.

@stg
Das habe ich schon befürchtet. Java entwickelt sich für mich immer mehr zur Krücke: der Bildschirminhalt kann nur mit OS-abhängigen Befehlen geleert werden, die Ausgabereihenfolge ist nicht sicher.. Auf irgendwas muss ich mich als Entwickler doch verlassen können, oder? ;-)

Verschwindet das Problem denn bei einer anderen Ausgabe z.B. im DOS-Fenster? Falls ja, wie wäre für eine solche Ausgabe der Befehl?

Grüße
 
Zuletzt bearbeitet:
Die Frage die sich mir dann nocht stellt, warum bietest du nicht eine Gui an ^^ dann musst du dich nicht mit der Eingabeaufforderung herumschlagen, und demnach auch nicht mit den Problemen die das mit sich bringt ?
 
Das Problem ist einfach, dass du den Error-Stream als Ausgabe für den Benutzer missbrauchst. Der Vorteil von zwei getrennten Streams liegt z.B. darin, dass du sie auf verschiedene Ziele lenken kannst. Etwa den Standard-Ausgabestrom auf die Konsole und den Error-Stream in ein log-File.
 
Zuletzt bearbeitet:

Zurück
Oben