Java 为什么本地打印作者会干扰另一个本地打印作者?
在这个程序中,第三个字符串永远不会被打印出来。为什么? (这个Java程序是在Ubuntu10.10上的EclipseIndigo上运行的。)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
通过关闭嵌套的
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;
}
}