Java 为什么本地打印作者会干扰另一个本地打印作者?

Java 为什么本地打印作者会干扰另一个本地打印作者?,java,console,printwriter,Java,Console,Printwriter,在这个程序中,第三个字符串永远不会被打印出来。为什么? (这个Java程序是在Ubuntu10.10上的EclipseIndigo上运行的。) 通过关闭嵌套的PrintWriter,您也可以关闭嵌入式System.out流,这似乎阻止了进一步的写入(尽管我希望出现异常,而不是吞噬输出) 因此,整个问题可以归结为: public class Tester { public static void main(String[] args) { System.o

在这个程序中,第三个字符串永远不会被打印出来。为什么?

(这个Java程序是在Ubuntu10.10上的EclipseIndigo上运行的。)


通过关闭嵌套的
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
,它包含以下可爱的方法:

ensureOpen()
方法确实抛出了一个异常,但它在这里被吞没,并且设置了
trouble
标志(一个众所周知的反模式)。因此,这会悄悄地忽略对封闭流的进一步写入。

从它的文档中可以看出

关闭流并释放与关联的所有系统资源 信息技术关闭以前关闭的流没有效果

所以我的猜测是,它正在释放System.out,因此无法再次使用。此外,我还添加了一个
System.out.println(“Finished”)行,如果在代码中的
System.out
上调用了关闭,则不会输出任何内容。试试看

public class Tester {

    public static void main(String[] args) {        
        System.out.println("first");
        System.out.close();
        System.out.println("second");        
    }
}
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;
    }
}