2009-07-28 49 views
11

Nếu tôi gọi phương thức run() trên một Thread và phương thức run() ném ra một ngoại lệ chưa bắt được thì kết quả sẽ là gì?Điều gì sẽ xảy ra khi Chủ đề ném ngoại lệ?

Ai bắt ngoại lệ này? Liệu nó có bị bắt không?

+5

Để làm cho điều này rõ ràng hơn - bạn không gọi run() - bạn gọi start() trên Thread để làm cho mã trong phương thức run() chạy trong một hàm mới chủ đề. Gọi run() trực tiếp chỉ làm cho phương thức chạy thực thi trong luồng hiện hành. – Nate

Trả lời

8

Nếu có trình xử lý ngoại lệ được cài đặt cho ThreadGroup, JVM chuyển ngoại lệ cho nó. Nếu đó là một chuỗi AWT, bạn có thể cài đặt một trình xử lý sự kiện cho các ngoại lệ không được giải quyết khác. Nếu không thì JVM sẽ xử lý nó.

Ví dụ về một nhóm chủ đề với một handler tùy chỉnh và làm thế nào để sử dụng nó:

public class MyThreadGroup extends ThreadGroup { 
    public MyThreadGroup() { 
     super("My Thread Group"); 
    } 
    public void uncaughtException(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... }; 
t.start(); 

Ví dụ về cách sử dụng một handler AWT ngoại lệ:

public class MyExceptionHandler { 
    public void handle(Throwable ex) { 
     // Handle exception 
    } 
    public void handle(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName()); 
+3

"Nếu không thì JVM sẽ xử lý nó." Nói một cách chính xác hơn, sợi chỉ đưa ra ngoại lệ sẽ âm thầm chết. –

+0

@Stephen: Trên thực tế nó in ngoại lệ cho stderr. – Draemon

+0

Thật sao? Nó phải được JVM cụ thể sau đó ... bởi vì tôi đã bị vấp bởi sự vắng mặt của một ngăn xếp dấu vết. –

1

Nếu bạn đã gửi các Runnable để một ExecutorService bạn có thể bắt ngoại lệ như được gói trong một ExecutionException. (Rất khuyến khích, chỉ cần gọi run())

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