web-dev-qa-db-fra.com

Quel est l'intérêt de System.err?

Sous UNIX, je suis censé écrire un fichier Java qui imprimera "EXIT 1" à l'erreur standard, puis quitter avec un état de 1.

Voici mon approche ..

System.err.println("EXIT 1");
System.exit(1);

C'est ce que je suis censé faire?

Si oui, comment suis-je censé l'utiliser dans les shells Unix? Lorsque je le compile et l'exécute dans le bash, il affiche simplement "EXIT 1" (donc il fait la même chose que System.out.println, pourquoi devrais-je utiliser "err"?). Quelle est "l'erreur standard" ici?

20
Gavin Z.

Chaque programme en cours d'exécution a ces trois flux:

  • Entrée standard (stdin), qui provient normalement du clavier. Exposé sous la forme System.in
  • Sortie standard (sortie standard), qui va normalement à la console. Exposé sous la forme System.out
  • Erreur standard (stderr), qui va normalement également à la console. Exposé sous la forme System.err

Votre programme est correct - il s'imprime sur stderr. Mais dans des circonstances normales, le flux stderr va à la console tout comme le flux stdout, ils ne peuvent donc pas être distingués visuellement.

Cependant, la raison pour laquelle vous devez utiliser stderr au lieu de stdout pour les messages d'erreur est la redirection . Cela signifie que vous envoyez stderr vers un fichier au lieu de la console. Pendant ce temps, stdout ne sera pas affecté, car les deux flux sont indépendants.

Par exemple, vous pouvez le faire dans bash, cmd, PowerShell, etc.:

$ Java Program 2> errors.txt

Maintenant, toutes les sorties avec System.err.println() finiront dans errors.txt, Tandis que System.out.println() ira toujours à l'écran. Cela peut aider au débogage.

29
MultiplyByZer0

Il existe trois flux de données associés à presque tous les processus:

  • Entrée standard: il s'agit du flux d'entrée dans un programme, à partir d'un terminal, d'une console, de la sortie canalisée d'un autre processus ou de tout autre moyen.
  • Erreur standard: c'est là que tous les messages de débogage et d'erreur doivent aller. C'est ainsi que ce type d'informations peut être facilement capturé séparément de la sortie régulière d'un programme. Pour ce faire, les serveurs Web envoient des messages d'erreur à un error_log fichier via stderr, tandis que le fichier journal normal serait e. g. access_log.
  • Sortie standard: c'est là que toutes les sorties attendues typiques qu'un utilisateur exécutant un programme devrait s'attendre à voir apparaître cette sortie.

La sortie standard (stdout) et l'erreur standard (stderr) sont presque toujours les premier et deuxième flux de sortie provenant d'un processus, respectivement. Cela me permet de faire quelque chose comme /path/to/my/neat/program > logs/program.log 2> logs/program.err et les sorties et les erreurs sont bien triées.

1
DopeGhoti