2009-02-04 56 views
5

Tôi có câu hỏi về thứ tự thực hiện các câu lệnh trong khối catch trong Java. khi tôi chạy lớp Test1 sau (xem bên dưới), tôi mong đợi có đầu ra là Hi !, sau đó là kết quả của e.printStackTrace(); tuyên bố, và sau đó Bye !. Tuy nhiên, tôi không bao giờ nhận được đơn đặt hàng này. Vui lòng xem các kết quả đầu ra mà tôi đã dán bên dưới.khối try-catch trong Java - câu lệnh thực hiện trong mã bắt

public class Test1 { 

    public static void calculate() { 
     try { 
      int h = 5/0; 
     } catch (ArithmeticException e) { 
      System.out.println("Hi!"); 
      e.printStackTrace(); 
     } 
     System.out.println("Bye!"); 
    } 

    public static void main(String[] args) { 
     calculate(); 
    } 

} 

Output1:

 
Hi! 
Bye! 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 

Output2:

 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 
Hi! 
Bye! 

Tôi có hai câu hỏi:

1.) Câu hỏi quan trọng hơn: Tại sao tôi luôn luôn có Hi! và tạm biệt! in luôn luôn sau cái khác, mặc dù mye.printStackTrace() trong mã là giữa chúng?

2.) Tại sao đôi khi tôi có đầu ra của câu lệnh e.printStackTrace() trước Hi !, và đôi khi sau khi tạm biệt! ? Tôi đã chạy chương trình nhiều lần và tôi không thể hiểu được trong hoàn cảnh nào tôi nhận được một bản in hoặc bản in khác.

Cảm ơn bạn.

Tôi đang sử dụng Java 6 và Eclipse (Ganymed).

Trả lời

18

Exception.printStackTrace() in để System.err trong khi "Hi!" và "Bye!" đang trên System.out. Nếu bạn chạy chương trình của bạn trên một bàn điều khiển thông thường, cuối cùng họ sẽ kết thúc trên màn hình, nhưng thứ tự có thể được ra ngoài. Nếu bạn đang chạy chương trình thông qua một IDE (ví dụ: NetBeans), các luồng có thể sẽ được mã hóa màu để bạn có thể dễ dàng phân biệt chúng.

2

Đây có thể là vấn đề về thời gian. Println ghi ra tiêu chuẩn, trong khi printStackTrace có thể được nối với lỗi tiêu chuẩn. Sau đó, nó chỉ là một vấn đề mà bộ đệm được đỏ mặt đầu tiên.

7

Bạn in "Xin chào!" và tạm biệt!" đến System.out (ví dụ: stdout), trong khi dấu vết ngăn xếp được in thành System.err (ví dụ: stderr). Thứ tự mà chúng được in được xác định khi hai bộ đệm được xóa.

+1

Lưu ý rằng bạn có thể chỉ định luồng cho Throwable # printStackTrace(), ví dụ: e.printStackTrace (System.out) –

0

thử thêm System.out.flush() sau mỗi lần in (bao gồm printStackTrace).

+0

Điều này không khắc phục được dự đoán thứ tự đầu ra. – mark

1

A1 - e.printStackTrace() in ra System.err chứ không phải System.out, do đó, các luồng khác nhau, thứ tự in khác nhau.

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