2013-04-26 64 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

相關問題