2010-07-02 156 views

Trả lời

48

Trong Java System.out.println() sẽ in theo tiêu chuẩn ra khỏi hệ thống bạn đang sử dụng. Mặt khác, System.err.println() sẽ in ra lỗi chuẩn.

Nếu bạn đang sử dụng ứng dụng bảng điều khiển Java đơn giản, cả hai đầu ra sẽ giống nhau (dòng lệnh hoặc bảng điều khiển) nhưng bạn có thể cấu hình lại luồng sao cho ví dụ, System.out vẫn in trên bàn điều khiển nhưng System.err ghi vào tệp .

Ngoài ra, các IDE như Eclipse hiển thị System.err bằng văn bản màu đỏ và mặc định là System.out trong văn bản màu đen.

+21

Ngoài ra, System.out được đệm, và System.err không –

+1

Quên về điều đó, thx cho thanh toán bù trừ nó lên noelmarkham –

+3

Không giải tán câu trả lời của bạn nhưng nó thường được gọi là lỗi tiêu chuẩn và chuẩn (stdout/stderr) thay vì tiêu chuẩn và lỗi. 1 bằng cách xin lỗi trước từ, khác hơn là nitpick, bạn là chính xác. – paxdiablo

3

Các lệnh đó sử dụng các luồng đầu ra khác nhau. Theo mặc định, cả hai thư sẽ được in trên bảng điều khiển nhưng có thể chuyển hướng một hoặc cả hai thư này thành tệp.

java MyApp 2>errors.txt 

Điều này sẽ chuyển hướng System.err đến errors.txt tệp.

+3

'java MyApp 2> errors.txt' là gì' 2> 'và cách nó hoạt động? bạn có thể giải thích? – UnKnown

17

System.out là "tiêu chuẩn đầu ra" (stdout) và System.err là "đầu ra lỗi" (stderr). Cùng với System.in (stdin), đây là ba luồng I/O tiêu chuẩn trong mô hình Unix. Hầu hết các môi trường lập trình hiện đại (C, Perl, vv) đều hỗ trợ mô hình này.

Luồng đầu ra tiêu chuẩn được sử dụng để in đầu ra từ "hoạt động bình thường" của chương trình, trong khi luồng lỗi là "thông báo lỗi". Những điều này cần phải tách biệt - mặc dù trong hầu hết các trường hợp chúng xuất hiện trên cùng một bảng điều khiển.

Giả sử bạn có một chương trình đơn giản, nơi bạn nhập số điện thoại và nó in ra người có số đó. Nếu bạn nhập số không hợp lệ, chương trình sẽ thông báo cho bạn về lỗi đó, nhưng không nên làm điều đó làm câu trả lời: Nếu bạn nhập "999-ABC-4567" và chương trình sẽ in thông báo lỗi "Không hợp lệ số ", điều đó không có nghĩa là có một người có tên" Không phải là số hợp lệ "có số là 999-ABC-4567. Vì vậy, nó in ra không có gì để đầu ra tiêu chuẩn, và thông báo "Không phải là một số hợp lệ" được in ra đầu ra lỗi.

+0

Tôi nghĩ đây là câu trả lời hay nhất, vì nó giải thích ý nghĩa của các luồng. –

-1

Cần lưu ý rằng hệ điều hành có một hàng đợi cho cả System.err và System.out. Hãy xem xét mã sau:

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

Nếu bạn biên dịch và chạy chương trình, bạn sẽ thấy thứ tự của kết quả đầu ra trong bảng điều khiển được trộn lẫn.

Hệ điều hành sẽ vẫn đúng thứ tự nếu bạn chỉ làm việc với System.out hoặc System.err. Nhưng nó ngẫu nhiên có thể chọn những gì để in bên cạnh giao diện điều khiển, nếu bạn sử dụng cả hai.

Ngay cả trong mã này đoạn mã bạn có thể thấy rằng để thỉnh thoảng được trộn lên:

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

"Hệ điều hành có một hàng đợi cho cả' System.err' và 'System.out'." Đó là một tuyên bố rất chung chung và không nhất thiết phải chính xác. Bạn đưa ra tuyên bố đó trên cơ sở nào? [Cần dẫn nguồn] Trong ứng dụng bảng điều khiển (chẳng hạn như 'cmd' hoặc' terminal'), cả hai luồng ("hàng đợi" như câu trả lời này gọi) xuất hiện để được hợp nhất (vì chúng hiển thị trong cùng trình mô phỏng thiết bị đầu cuối), nhưng chúng thực sự tách biệt. Xem [Sự khác biệt giữa 'stdout',' stderr' và 'stdin'] (https://stackoverflow.com/a/3385261/2225787) để biết chi tiết. –

Các vấn đề liên quan