| 特性 | System.out | System.err |
|---|---|---|
| 用途 | 標準輸出流,業務日誌、結果輸出 | 標準錯誤流,異常堆棧、關鍵告警 |
| 緩衝機制 | 默認帶緩衝 | 默認無緩衝(即時刷新) |
| Eclipse 顏色 | 藍色 | 紅色 |
| Log4j 捕獲 | 默認不捕獲 | 默認捕獲至日誌文件 |
經典測試代碼揭示隱患:
public class Test2 {
static { System.out.println("1"); }
public static void main(String[] args) {
System.err.println("2"); // 無緩衝,立即輸出
new Test2(); // 觸發靜態塊 -> "1"
}
public Test2() { System.out.println("3"); } // 有緩衝,延遲輸出
}
輸出結果:2 可能出現在 1 和 3 之間(隨機),因為 err 繞過緩衝直接落盤/顯示,而 out 積累緩衝區才刷新。
⚠️ 生產代碼中嚴禁混用 out/err 進行同步邏輯輸出,應統一使用日誌框架(SLF4J+Logback)。
java App > out.log 2> err.log:分離業務輸出與錯誤診斷stdout/stderr 路徑logger.info()logger.error()(內部走 err)System.out,但提交前需清理flush() 確保順序