Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Consol-Ausgabe nach Exception durcheinander

1 view
Skip to first unread message

Alberto Luca

unread,
May 29, 2008, 3:32:38 PM5/29/08
to
Hallo NewsGroup,

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


Meex

unread,
May 29, 2008, 5:41:35 PM5/29/08
to

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

Heiner Kücker

unread,
May 29, 2008, 5:49:53 PM5/29/08
to
Alberto schrieb

> Warum ist die Consol-Ausgabe jedoch nicht in dieser Reihenfolge, sondern
> es wird vor "e1.printStackTrace()" die Eingabeaufforderung ausgegeben?

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

Achim Peters

unread,
May 29, 2008, 5:52:20 PM5/29/08
to
Alberto Luca wrote:
> 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?

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

Alberto Luca

unread,
Jun 3, 2008, 1:22:29 PM6/3/08
to
Hallo Newsgroup,

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


0 new messages