out有緩存,err無
當向控制檯輸出信息時,開發者有兩個選擇:System.out和System.err。使用者更傾向於輸出的是System.out,而如果是System.err則輸出“error”。儘管這看起來是顯而易見的,但很多開發者都不瞭解爲什麼出錯和調試時使用System.err。
當輸出一個流時,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時都將顯示錯誤信息。