6 votes

Imprimer la sortie et un message d'erreur à la console

J'essaie d'imprimer une sortie et un message d'erreur sur la console. Mais parfois la séquence de sortie change, d'abord il imprime le message d'erreur et ensuite il imprime le message simple. Quelqu'un peut-il m'aider à comprendre pourquoi cela se passe ainsi ? la séquence de sortie change la plupart du temps. Il n'y a pas de cohérence dans la sortie imprimée. J'utilise l'IDE Eclipse et la sortie que j'obtiens est la suivante.

J'ai essayé d'imprimer le code suivant,

System.out.println("simple message");  
System.err.println("error message");  

le résultat attendu est le suivant :

message simple

message d'erreur

mais le résultat réel est le suivant :

message d'erreur

message simple

3voto

Simeon Ikudabo Points 1321

System.out.println() et System.err.println() sont des flux d'exécution différents. Les flux de sortie sont mis en cache, de sorte que toute l'écriture se fait dans cette mémoire tampon. Après une période de silence, ils sont réellement écrits. Voici une boucle for qui montre essentiellement votre erreur à nouveau :

for(int x = 0; x <= 5; x++) {
    System.out.println("Out");
    System.err.println("Err");

}

Afin de "vider" les flux, appelez .flush() à chaque fois que vous passez dans la boucle :

for(int x = 0; x <= 5; x++) {
    System.out.println("Out");
    System.out.flush();
    System.err.println("Err");
    System.err.flush();

}

Dans cette boucle for, le message out et le message err s'imprimeront initialement, mais à chaque purge, vos messages out s'imprimeront en premier, puis vos messages err. La sortie sera quelque chose comme :

OutErr
Out
Out
Out
Out
Out

Err
Err
Err
Err
Err

Et c'est parce que System.out et System.err sont exécutés sur des flux différents.

1voto

Till Brychcy Points 1260

Même si vous purgez vos flux après avoir écrit, ces flux sont lus par différents threads dans Eclipse et si les écritures sont presque simultanées, il arrive que le thread pour lire stderr soit exécuté avant le thread pour stdout même si l'écriture correspondante vers stdout s'est produite en premier.

Depuis Java 1.5, il y a la classe ProcessBuilder et avec celle-ci, le problème pourrait être résolu dans Eclipse en redirigeant stderr vers stdout pendant le lancement - mais la fonctionnalité d'Eclipse d'afficher la sortie stderr dans une couleur différente serait cassée par cela.

Vous pouvez ajouter votre opinion à https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205

0voto

Indunil Aravinda Points 623

Comme il s'agit de deux flux d'exécution différents, ils s'exécutent indépendamment. De plus, ils ne sont pas dans une portée de bloc différente, de sorte que la fonction close() n'est pas appelée, ce qui évite d'appeler la fonction flush(). Ils sont donc au même niveau. La JVM prend donc la tête ici et exécute ces deux flux comme elle le souhaite.

Par conséquent, appeler intentionnellement flush() à la fin de chaque flux vous aidera à reprendre le contrôle de votre code.

0voto

Essayez ceci

System.out.println("Out");

 System.out.flush();

 System.err.flush();

 System.err.println(" err ");

0voto

user7294900 Points 16410

Comme suggéré dans les précédents réponses vous pouvez définir le même flux pour la sortie et le flux d'erreur en utilisant System.setErr

System.setErr(System.out);

Réaffecte le flux de sortie d'erreur "standard".

Mais cette configuration n'est pas recommandée pour une application réelle dans un environnement de production.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X