folgendes Coding erzeugt u.s. Consol-Ausgabe:
boolean inputOk = false;
// --- Eingabeaufforderung, bis OK
while (!inputOk) {
System.out.println("Bitte gib dein Geburtsjahr ein:");
try {
this.Year = Integer.parseInt(in.readLine()); // Convert Consol-Input into
int
inputOk = true; // Eingabe OK
} catch (NumberFormatException e1) {
// TODO Auto-generated catch block
System.out.println("NumberFormatException/..., das war keine Zahl!!!");
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println("IOException");
e1.printStackTrace();
}
} // while
Consol-Ausgabe:
Bitte gib dein Geburtsjahr ein:
jkljkl
NumberFormatException/..., das war keine Zahl!!!
Bitte gib dein Geburtsjahr ein:
java.lang.NumberFormatException: For input string: "jkljkl"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at edu.hm.cs.swe.birth.elements.Year.requestBirthYear(Year.java:49)
at edu.hm.cs.swe.birth.Application.main(Application.java:20)
Frage:
Im Coding wird NumberFormatException abgefangen und zunächst meine
Consolausgabe durchlaufen
=> System.out.println("NumberFormatException/..., das war keine Zahl!!!");
Anschl. wird
=> e1.printStackTrace();
ausgeführt.
Warum ist die Consol-Ausgabe jedoch nicht in dieser Reihenfolge, sondern es
wird vor "e1.printStackTrace()" die Eingabeaufforderung ausgegeben?
Besten Dank vorab!
Ciao, Alberto
Hallo,
defaultmässig schreibt der printStackTrace() auf System.err, wenn du
System.out verwendest, also e1.printStackTrace(System.out), wird das
auch richtig angezeigt. Vermutlich hängt es mit der internen
Synchronisation der beiden Streams zusammen.
ciao
Meex
Scheinbar läuft Dein Programm in der Eclipse.
Die Ausgaben auf die Konsole werden gepuffert.
Dadurch kommt es bei Exceptions zu vermischten Ausgaben.
Du kannst diesen Effekt durch eine kleine Wartezeit
umgehen:
try
{
..Problmcode
}
catch ( Exception exc )
{
WaitUtil.wait( 100 ); // warten, damit die von Eclipse
durcheinander ausgegebenen System.err und System.out getrennt ausgegeben
werden
System.err.println(exc.getMessage());
}
package de.cnc.util;
/**
* Hilfsklasse hartes warten in Millisekunden . <br/>
*
* @author Heiner Kücker
*/
public final class WaitUtil {
/**
* hartes warten in Millisekunden . <br/>
* Der aktuelle Thread wird über Thread.sleep() schlafen gelegt. <br/>
*
* @param iPaTime Wartezeit in Millisekunden
*/
public static final void wait(int time) {
try {
Thread.sleep(time);
} catch (Exception e)
{
// Schau mal beim Kabutz, eigentlich sol dieser Block nicht leer bleiben
// Ist aber eher was für Experten
} // end catch
}// end method wait
}// end method WaitUtil
> Besten Dank vorab!
> Ciao, Alberto
Bitte
--
Heiner Kücker
www.heinerkuecker.de
www.control-and-command.de
Weil e1.printStackTrace() nach stderr ausgegeben wird und ggf. stderr
und/oder stdout von Deinem OS gepuffert werden. Vielleicht helfen Dir an
der einen oder anderen Stelle eingebaute flush() weiter.
Bye
Achim
besten Dank für Eure wertvollen Tipps.
> defaultmässig schreibt der printStackTrace() auf System.err, wenn du
> System.out verwendest, also e1.printStackTrace(System.out), wird das
> auch richtig angezeigt. Vermutlich hängt es mit der internen
> Synchronisation der beiden Streams zusammen.
Nach e1.printStackTrace(System.out) ist die Konsolausgabe wie gewünscht.
Vermutlich lags an den Threads!!??
Ciao, Alberto