在一次筆試中遇到了一個System.err.println()的輸出,之前沒有見過,回來查一查,自己還是見識太短,來補充一下。
首先看一看jdk中
來一個簡單的實驗
第一次顯示
第二次顯示
1. 發現並不是順序輸出的,而且err輸出不是搶在out之前,就是緊跟在之后,之間的換行沒有作用了,這是為什么呢?
順序與預料的不同並不是因為err和out的區別導致,而是因為他們是兩個流,由於緩存原因導致輸出順序不同。
2.System.out.println 能重定向到別的輸出流,這樣的話你在屏幕上將看不到打印的東西了,
System.err.println 只能在屏幕上實現打印,即使你重定向了也一樣。
3、當向控制台輸出信息時,開發者有兩個選擇:System.out和System.err。使用者更傾向於輸出的是System.out,而如果是 System.err則輸出“error”。盡管這看起來是顯而易見的,但很多開發者都不了解為什么出錯和調試時使用System.err。(如果你使用err打印出的字符串,在eclipse的console會顯示成紅色的哦。)
當輸出一個流時,JVM和操作系統共同決定何時輸出這個流。也就是說,盡管開發者鍵入了:
- System.out.print("Test Output:");
JVM和操作系統的組合體並不會立即輸出這個流。相反,它將保持等待狀態直到將要輸出的東西達到一定的量。
假設輸入以下指令:
- System.out.println("Debugging Info.");
JVM可能同意輸出;然而,操作系統可能決定暫不輸出。
由於這個原因,在調試程序時想要發現出錯的位置就有可能成為問題。考慮以下的程序:
- for(int i=0; i<56; i++) {
- System.out.println(i);
- ... // containing an error
- }
錯誤可能出現在i等於54時,但是可能JVM在i等於49時就結束輸出了。50到54仍然存在於緩存中,結果也就丟失了。
使用System.err來報告錯誤、調試程序就可以避免這種情況出現,它將使每一次操作的結果都輸出出來。例如以下程序:
- for(int i=0; i<56; i++) {
- System.err.println(i);
- ... // containing an error
- }
在每一次i等於54時都將顯示錯誤信息。
對於我們而言在調試程序的時候盡量使用err來輸出,這樣可以很清晰的定位到任何一個步驟,而out輸出的位置順序很可能和你期望的不一樣。
4、err輸出是紅色的。
5、System.err和System.out就是錯誤輸出和標准輸出,如果你用LOG4J記錄日志的話,且設定錯誤等級的話,System.err的輸出是將記錄到日志中。