| Closing the standard output streams `System.out` or `System.err` will cause all | |
| subsequent standard output to be dropped, including stack traces from exceptions | |
| that propagate to the top level. | |
| Avoid using try-with-resources to manage `PrintWriter`s or `OutputStream`s that | |
| wrap `System.out` or `System.err`, since the try-with-resource statement will | |
| close the underlying streams. | |
| That is, prefer this: | |
| ``` {.good} | |
| PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.err)); | |
| pw.println("hello"); | |
| pw.flush(); | |
| ``` | |
| Instead of this: | |
| ``` {.bad} | |
| try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.err))) { | |
| pw.println("hello"); | |
| } | |
| ``` | |
| Consider the following example: | |
| ``` | |
| import java.io.OutputStreamWriter; | |
| import java.io.PrintWriter; | |
| import static java.nio.charset.StandardCharsets.UTF_8; | |
| public class X { | |
| public static void main(String[] args) { | |
| System.err.println("one"); | |
| try (PrintWriter err = new PrintWriter(new OutputStreamWriter(System.err, UTF_8))) { | |
| err.print("two"); | |
| } | |
| // System.err has been closed, no more output will be printed! | |
| System.err.println("three"); | |
| throw new AssertionError(); | |
| } | |
| } | |
| ``` | |
| The program will print the following, and return with exit code 1. Note that the | |
| last `println` doesn't produce any output, and the exception's stack trace is | |
| not printed: | |
| ``` | |
| one | |
| two | |
| ``` |