Закрывая вложенный PrintWriter
, вы также закрываете встроенный поток System.out
, который, по-видимому, предотвращает дальнейшие записи в него (хотя я бы ожидал, что на самом деле вместо глотания вывода).
Так чтовся проблема может быть уменьшена до:
public class Tester {
public static void main(String[] args) {
System.out.println("first");
System.out.close();
System.out.println("second");
}
}
Это тоже больше не печатается после "first" , но также не вызывает исключения.Очень быстрый сеанс отладки показывает, что есть вызов собственной функции Sun, в которую немного сложнее отладить.
Обновление *
Это виновник: System.out
относится к типу java.io.PrintStream
и содержит следующий прекрасный метод:
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
Метод ensureOpen()
действительно вызывает исключение, но здесь он проглатывается и trouble
флаг установлен (хорошо известный анти-шаблон).Таким образом, это молча игнорирует дальнейшие записи в закрытый поток.