S1lentSt0rm S1lentSt0rm - 1 month ago 13
Java Question

After closing stdout: Java silently swallows everything written to stdout

Have a look at this example:

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {

public static void main(String[] args) {
System.out.println("hi there!");
System.out.close();
System.out.println("I'm silently swallowed :(");
System.out.flush(); // even flushing and closing again
System.out.close(); // doesn't throw an Exception
try {
FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
fos.flush(); // same goes for this more direct approach
fos.close();
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
}


Why doesn't the JVM tell me somehow, that writing to stdout failed? I would expect to get an Exception somewhere.

How else could I detect such a situation?

Answer

Official specification says it all.

Unlike other output streams, a PrintStream never throws an IOException; instead, exceptional situations merely set an internal flag that can be tested via the checkError method.

If your question is "why did they decide to do it this way", then all we can do is make educated guesses, but opinions are off-topic on this site.