Codeausführung bevor Exception abgeschlossen ist

Daimond

Mitglied
Guten Tag,
ich habe das Problem wenn bei mir eine Exception auftritt der System.out.println() schon ausgeführt wird bevor der printStackTrace fertig ist. Dieses Problemm tritt aber nicht jedesmal auf. Wie kann ich dafür sorge tragen das zuerst der printStackTrace fertig ausgeführt wird bevor weitere Code ausgeführt wird.

Fehlerhafte ausgabe:

Die Angegebene Datei wurde nicht gefunden.
Drücken sie die Eingabetaste Taste zum beenden des Programms.
java.io.FileNotFoundException: C:\Users\xxxxx\Desktop\sperrliste2.csv (Das System kann die angegebene Datei nicht finden)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
(.............)


Code:
} catch (FileNotFoundException e) {
     System.err.println("Die angebene Datei wurde nicht gefunden.");
     e.printStackTrace();
   }
(........)
     System.out.println("Drücken sie die Eingabetaste Taste zum beenden des Programms.");
     
   }
 
Das sind nur weitere Exceptionhandler.
Code:
} catch (FileNotFoundException e) {
       System.err.println("Die Angegebene Datei wurde nicht gefunden.");
       e.printStackTrace();
     }
     
     catch (UnsupportedEncodingException e){
       System.out.println("Die angebene Datei besitz eine falsche Kodierung.");
       e.printStackTrace();
     }
     catch (IOException e) {
     System.err.println("Fehler beim Schreiben oder Lesen der Datein.");
     e.printStackTrace();
   }
     catch(Exception e){
       System.out.println("Es ist ein unbekannter Fehler aufgetreten.");
       e.printStackTrace();
     }
     
     System.out.println("Drücken sie die Eingabetaste Taste zum beenden des Programms.");
 
e.printStackTrace schreibt in den Standard-Error-Stream, anschließend schreibst du in den Standard-Output-Stream. Beide Streams schreiben bei dir nun unabhängig voneinander in die Konsole. Da ist es nicht verwunderlich, wenn die Ausgaben sich vermischen. Bedenke, dass du nicht direkt auf die Konsole schreibst, sondern nur in einen Stream! Sobal das Schreiben in den Error-Stream abgeschlossen ist verlässt du den catch-Block und schreibst in den Output-Stream. Zu diesem Zeitpunkt hast du aber keine Garantie darauf, dass alles aus dem Error-Stream bereits in die Konsole geschrieben wurde ... wie gesagt, das sind zwei unabhängig Streams!

Du könntest einfach ein Thread.sleep() einbauen, um ein bisschen mit der Ausgabe zu warten. Aber eine 100%ge Garantie hast du niemals, sofern du das Grundproblem, dass zwei Stream konkurrierent auf das selbe Ziel schreiben, nicht löst.

@Edit: da war Tobse schneller... 🙂
 
Zuletzt bearbeitet:
Dann sollte es ja ausreichen wenn ich das Programm für eine halbe Sekunde schlafen lege bevor ich mit dem System.out weiter machen. Mich jetzt noch mit Synchronisierung von Threads auseinander setzen würde den Rahmen für das kleine Projekt sprengen.
 
oder z.B. log4j benutzen, dann siehst du deine info- und error-meldungen auch nach dem verlassen des programms noch in den log-dateien. die konsole nutzt man ja meistens nur beim testen / entwickeln
 
Es ist nen kleines Programm wo eine Grafische oberfläche nicht benötigt wird da die einzigste Eingabe über den JFileChooser erfolgt. Daher erfolgen die Ausgaben und fehlermeldung auf der Console. Und für ein Programm das ein bis zweimal im Jahr benutzt wird, sehr klein ist, wodurch auch das Risiko von Bugs sehr gering ist, spare ich mir die logs. Der einzigste Fehler dürfte vor der Tastatur sitzen 🙂
 
In dem Fall, wie oben schon kurz erwähnt, einfach ne kleine Pause einlegen:

Statt
Java:
System.out.println("Drücken sie die Eingabetaste Taste zum beenden des Programms.");
Einfach mal
Java:
System.err.flush();
Thread.sleep(1000);
System.out.println("Drücken sie die Eingabetaste Taste zum beenden des Programms.");
versuchen. In den meisten Fällen sollte das eigentlich gut gehen.
 
@Tobse: Man kann natürlich auch den ErrorStream komplett auf den OutputStream umbiegen, aber dann gehen auch die damit verbundenen Vorteile verloren, die man bei zwei getrennten Streams hat ....

@Tobse: Das Java Tag geht nun so: [C ODE="Java"] ... [/C ODE] 🙂
 
Wie schon grad gesagt habe. Ne Sekunde die Klasse schlafen legen reicht aus. Und mehr werde Ich auch für so ein kleines unwichtiges Programm nicht tun. Das mit dem umbiegen wäre natürlich auch ne möglichkeit, scheint mir aber recht unsauber zusein.
Danke für die Aufklärung und Hilfe.
 

Zurück
Oben