Java 为什么System.err.println在System.out.println之前打印?
我试着从《责任链》这篇文章中找出一个例子。 在idea中运行示例,打印:Java 为什么System.err.println在System.out.println之前打印?,java,Java,我试着从《责任链》这篇文章中找出一个例子。 在idea中运行示例,打印: Sending to stderr: An error has occurred. Writing to stdout: Entering function y. Writing to stdout: Step1 completed. Sending via email: Step1 completed. Writing to stdout: An error has occurred. Sending via email
Sending to stderr: An error has occurred.
Writing to stdout: Entering function y.
Writing to stdout: Step1 completed.
Sending via email: Step1 completed.
Writing to stdout: An error has occurred.
Sending via email: An error has occurred.
但当我在Stders writeMessage中设置一个断点时
class StderrLogger extends Logger {
public StderrLogger(int mask) {
this.mask = mask;
}
protected void writeMessage(String msg) {
System.err.println("Sending to stderr: " + msg);//break out here
}
}
它打印除std err之外的所有消息,这里没有涉及线程,
那为什么它在运行案例的第一行打印stderr呢
System.err
刷新与Eclipse中的System.out
不同
在Eclipse中尝试以下操作:
public class Derp {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
System.out.println("OUT");
System.err.println("ERR");
}
}
}
公共类Derp{
公共静态void main(字符串[]args){
对于(int i=0;i<10;i++){
System.out.println(“out”);
系统错误打印项次(“错误”);
}
}
}
这将随机打印出大块的大部分out
s和大部分ERR
s。然而,正如Evgeniy Dorofev所指出的,这是一个Eclipse问题,而不是Java问题
如果在终端中运行此示例程序,您将注意到正确的输出,而无需任何刷新
更新:
感谢叶甫盖尼·多洛菲夫指出这一点!
冲洗不工作是一个Eclipse问题
System.out.println
->将输出发送到标准输出流。一般监控
System.err.println
->将输出发送到标准错误流。一般监控
流out
和err
是独立的
要获得所需的输出,您必须刷新流或仅使用一个流进行所有输出
您可以使用
System.out.flush()
和System.err.flush()代码>中的代码如果您是从Eclipse打印它,这是一个已知的错误流可以以不同的方式缓冲、刷新,等等。这是正确的答案。从命令行运行类似的程序并输出到操作系统终端会产生正确的输出。在Idea community edition 11.1中,它会先打印所有错误,然后再打印出来。如果我将@Andrei建议的类更改为:System.out.println(“out”);System.out.flush();系统错误打印项次(“错误”);System.err.flush();它先打印出所有数据,然后出错。