System.out.println()和System.err.println()


在一次筆試中遇到了一個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和操作系統共同決定何時輸出這個流。也就是說,盡管開發者鍵入了:  

[java] view plain copy
 
  1. System.out.print("Test Output:");   

  

  JVM和操作系統的組合體並不會立即輸出這個流。相反,它將保持等待狀態直到將要輸出的東西達到一定的量。  

  假設輸入以下指令:   

[java] view plain copy
 
  1. System.out.println("Debugging Info.");    


  JVM可能同意輸出;然而,操作系統可能決定暫不輸出。  
  由於這個原因,在調試程序時想要發現出錯的位置就有可能成為問題。考慮以下的程序:     

[java] view plain copy
 
  1. for(int   i=0;   i<56;   i++)   {    
  2.   System.out.println(i);    
  3.   ...   //   containing   an   error    
  4.   }   


  錯誤可能出現在i等於54時,但是可能JVM在i等於49時就結束輸出了。50到54仍然存在於緩存中,結果也就丟失了。  
   
  使用System.err來報告錯誤、調試程序就可以避免這種情況出現,它將使每一次操作的結果都輸出出來。例如以下程序:     

[java] view plain copy
 
  1. for(int   i=0;   i<56;   i++)   {    
  2. System.err.println(i);    
  3. ...   //   containing   an   error    
  4. }    


  在每一次i等於54時都將顯示錯誤信息。

對於我們而言在調試程序的時候盡量使用err來輸出,這樣可以很清晰的定位到任何一個步驟,而out輸出的位置順序很可能和你期望的不一樣。
4、err輸出是紅色的。
5、System.err和System.out就是錯誤輸出和標准輸出,如果你用LOG4J記錄日志的話,且設定錯誤等級的話,System.err的輸出是將記錄到日志中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM