2010-07-02 65 views

回答

48

在Java System.out.println()將打印到您正在使用的系統之外的標準。另一方面,System.err.println()將打印到標準錯誤。

如果您使用的是簡單的Java控制檯應用程序,兩個輸出將是相同的(在命令行或控制檯),但你可以重新配置流,因此例如,System.out仍然打印到控制檯,但System.err寫到一個文件。

另外,Eclipse等IDE顯示爲System.err紅色文本,System.out默認爲黑色文本。

+21

此外,System.out的緩衝,和System.err不 – 2010-07-02 05:27:59

+1

忘了這一點,THX清理起來noelmarkham – 2010-07-02 05:39:34

+3

不排除你的答案,但它通常被稱爲標準輸出和標準錯誤(stdout/stderr),而不是標準輸出和錯誤輸出。 +1提前道歉,除了那個挑剔之外,你是對的。 – paxdiablo 2010-07-02 05:40:18

3

這些命令使用不同的輸出流。默認情況下,這兩條消息都將打印在控制檯上,但可以將其中一個或兩個都重定向到一個文件。

java MyApp 2>errors.txt 

這將重定向到System.err文件errors.txt

+3

'java myapp 2> errors.txt'什麼是'2>'以及如何有用?你可以解釋嗎? – UnKnown 2016-04-01 02:29:06

17

System.out的是 「標準輸出」(標準輸出)和System.err是 「錯誤輸出」(錯誤)。與System.in(stdin)一起,這些是Unix模型中的三個標準I/O流。大多數現代編程環境(C,Perl等)都支持這種模式。

標準輸出流用於打印來自程序「正常操作」的輸出,而錯誤流用於「錯誤消息」。這些需要分開 - 儘管在大多數情況下它們都出現在同一個控制檯上。

假設您有一個簡單的程序,您可以在其中輸入電話號碼並打印出具有該號碼的人。如果你輸入了一個無效號碼,程序會通知你該錯誤,但它不應該這樣做作爲答案:如果你輸入「999-ABC-4567」並且程序打印一條錯誤信息「Not a valid號碼「,這並不意味着有一個名爲」不是有效號碼「的人的號碼是999-ABC-4567。因此它不會向標準輸出打印任何內容,並且錯誤輸出中會顯示消息「不是有效的數字」。

+0

我認爲這是最好的答案,因爲它解釋了流的含義。 – 2015-02-05 15:02:21

-1

值得注意的是,OS有一個System.err和System.out的隊列。請看下面的代碼:

public class PrintQueue { 
    public static void main(String[] args) { 
     for(int i = 0; i < 100; i++) { 
      System.out.println("out"); 
      System.err.println("err"); 
     } 
    } 
} 

如果你編譯並運行程序,你會看到的輸出在控制檯的命令混合起來。

如果您只使用System.out或System.err,則操作系統將保持正確的順序。但是,如果您同時使用這兩個選項,它可以隨意選擇要在控制檯旁邊打印的內容。

即使在這段代碼,你可以看到,爲了有時混合起來:

public class PrintQueue { 
    public static void main(String[] args) { 
     System.out.println("out"); 
     System.err.println("err"); 
    } 
} 
+0

「一個操作系統對於System.err和System.out都有一個隊列。」這是一個非常籠統的,不一定準確的陳述。你在什麼基礎上做出這種表述? [引文需要] 在控制檯應用程序(如'cmd'或'terminal')中,兩個流(此答案稱爲「隊列」)似乎都合併(因爲它們顯示在相同的終端仿真器中),但它們實際上是分開的。有關詳細信息,請參見[stdout','stderr'和'stdin'](https://stackoverflow.com/a/3385261/2225787)之間的區別。 – 2017-11-03 13:51:16

相關問題