Java printStackTrace + println()

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
552
Hallo,

ich abe folgenen Code geschrieben:
Code:
package Exceptions;

import java.util.Scanner;

public class MainClass {

    public static void main(String[] args) {

        while (true) {
            Scanner userInput = new Scanner(System.in);
            System.out.println("Zahl eingeben: ");
            try {
                userInput.nextDouble();
                break;
            } catch (Exception ex) {
                System.out.println("Falsche Eingabe");
                ex.printStackTrace();
            }
        }
    }

}
Problem: Er gibt mir in der Ausgabe zuertst das println aus, bevor er den StackTrace ausgibt.
Warum ist das so, müsste er mit println nicht warten, bis die Ausgabe des StackTrace beendet ist?

Code:
Falsche Eingabe
java.util.InputMismatchException
Zahl eingeben: 
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextDouble(Scanner.java:2413)
	at Exceptions.MainClass.main(MainClass.java:13)
 
hi yxy,

ich versuche es mal von laie zu laie, bis sich ein profi zuschaltet :)

dein code wird der reihe nach abgearbeitet:
Code:
catch (Exception ex) {
                System.out.println("Falsche Eingabe");
                ex.printStackTrace();
            }

mit anderen worten, wenn catch greift beginnt er mit dem ersten befehl in der klammer und der ist nunmal println
erst danach kommt dein StackTrace

Wenn Du es andersrum haben willst, tausch die beiden zeilen halt aus.

gruß,
dered
 
Danke für deine Antwort.

Ich hätte vielleicht dazusagen sollen, dass ich println("Zahl eingeben") meine :)
 
Woher kommt die Ausgabe? Von der Kommandozeile oder aus Eclipse/…? Das sieht mir nach einer Race Condition aus zwischen System.out und System.err (was von printStackTrace genutzt wird). Das ist aber nicht der Fehler in deinem Programm sondern in der Konsole, wie sie zwei Streams zusammensetzt.
 
Die Ausgabe kommt aus NetBeans.
 
Da geht es

Code:
run:
Zahl eingeben: 
i
Falsche Eingabe
java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextDouble(Scanner.java:2413)
	at Exceptions.MainClass.main(MainClass.java:12)
Zahl eingeben: 
k
 
Dadurch, dass du den Fehler abfaengst, stuertzt das Programm nicht ab, es gibt keine (standard) stacktrace ausgabe deshalb. Stattdessen wird die Exception dem Object ex zugeordnet. Dein Programm laeuft ganz normal weiter. Die Stack trace ausgabe kommt spaeter durch den aufruf der methode.
 
Ja, aber müsste dann trotzdem vor der Audgabe "Zahl eingeben" kommen.

Hier nochmal die Ausgabe:
Code:
Zahl eingeben: 
p
Falsche Eingabe
java.util.InputMismatchException
Zahl eingeben: <------------------------------------------------dürfte hier nicht stehen
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextDouble(Scanner.java:2413)
	at Exceptions.MainClass.main(MainClass.java:13)
 
Zuletzt bearbeitet:
Hancock hat es doch in #4 schon aufgelöst. Die eine Ausgabe landet in stdout, die andere in stderr. Das sind zwei eigenständige Dateien, die da befüllt werden. Ein Eintrag in der einen weiß von dem in der anderen gar nichts und in zeitliche Relation sind sie auch nicht zu setzen.

Dann kommt noch buffering dazu und schon ist die Reihenfolge in dieser Konsole nicht mehr gewährt. Das ist aber kein wirkliches Problem, sondern künstlich erzeugt, da hier stdout und stderr ohne tieferen Sinn vermischt werden, um mit dem Benutzer zu kommunizieren und dann kommt noch die Netbeans-Konsole dazu, die den Brei irgendwie zusammenklebt.

Bleib einfach bei stdout (da kannst du deinen Stacktrace auch wiedergeben) und benutze stderr bestenfalls, um vor Programmabbrüchen noch schnell Tschüss zu sagen. Oder begib dich aufs nächste Level der User-Interaktion und biete eine (Web-)Oberfläche an.
 
Bleib einfach bei stdout (da kannst du deinen Stacktrace auch wiedergeben)

Und wie mache ich das? Die Methode printStackTrace() liefert mir ja stderr, oder?

EDIT: Habs: printStackTrace(System.out)
Ergänzung ()

Vielen Dank für eure Hilfe :)
 
Zuletzt bearbeitet:
Zurück
Oben