S1lentSt0rm
S1lentSt0rm

Reputation: 2039

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?

Upvotes: 3

Views: 113

Answers (1)

Marko Topolnik
Marko Topolnik

Reputation: 200148

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.

Upvotes: 4

Related Questions