2013-04-26 66 views
2

我当时试图从wiki责任链文章的Logger例子。 运行在想法例如,它打印:为什么在System.out.println之前打印System.err.println?

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. 

但是当我把一个破发点中stderrs的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所有messags,没有这里涉及到, 线程那么为什么它的印刷stderr在第一线运行的情况下?在Eclipse中,

+4

流可以有不同的缓冲,不同的冲洗等 – 2013-04-26 12:19:50

回答

9

System.errSystem.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"); 
     } 
    } 
} 

这会随机打印出大部分OUT S和大部分ERR S在大块。然而,正如Evgeniy Dorofeev指出的那样,这是一个Eclipse问题,而不是Java问题。

如果您在终端中运行此示例程序,您将注意到正确的输出,无需任何刷新。

更新: 感谢Evgeniy Dorofeev指出了这一点! 冲洗不工作是一个Eclipse问题!

+1

在理念的社区版11.1它先打印出所有的错误,然后再打印出来。 – 2013-04-26 12:53:08

1

System.out.println - >将输出发送到标准输出流。一般来说监控

System.err.println - >将输出发送到标准错误流。一般来说监控

outerr是独立的。

要获得所需的输出,您必须刷新流或仅使用一个流进行所有输出。

您可以在代码中使用System.out.flush();System.err.flush();

+0

如果我更改@Andrei类建议: System.out.println(“OUT”); System.out.flush(); System.err.println(“ERR”); System.err.flush(); 它首先打印所有的OUT然后ERR。 – 2013-04-26 12:59:06

相关问题