blob: 329e941a70f6f71ae4ecc6f4d07729ae3c5c7ccb [file] [view] [edit]
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
```