Java 为什么System.err.println在System.out.println之前打印?

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

我试着从《责任链》这篇文章中找出一个例子。 在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: 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();它先打印出所有数据,然后出错。