2009-07-28 20 views
11

Jeśli wywołać metodę run() na wątku, a metoda run() rzuca niezręczny wyjątek, jaki byłby wynik?co się dzieje, gdy wątek wyrzuca wyjątek?

Kto łapie ten wyjątek? Czy nawet zostanie złapany?

+5

Aby było to bardziej zrozumiałe - nie uruchamiasz run() - wywołujesz start() na wątku, aby kod w metodzie run() działał w nowym wątek. Wywołanie metody run() bezpośrednio powoduje wykonanie metody run w bieżącym wątku. – Nate

Odpowiedz

8

Jeśli w grupie wątków jest zainstalowany moduł obsługi wyjątku, maszyna JVM przekazuje do niego wyjątek. Jeśli jest to wątek AWT, możesz zainstalować procedurę obsługi zdarzeń dla nieobsługiwanych wyjątków. W przeciwnym razie JVM go obsługuje.

Przykład grupy gwintu z niestandardowej obsługi i jak go używać:

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(); 

przykład wykorzystania programu obsługi wyjątków AWT:

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

"W przeciwnym razie JVM go obsługuje." Aby być bardziej precyzyjnym, wątek, który podniósł wyjątek, cicho umrze. –

+0

@ Step: Właściwie to wypisuje wyjątek na stderr. – Draemon

+0

Naprawdę? Musi to być konkretna maszyna JVM ... ponieważ zostałem potknięty przez brak śledzenia stosu. –

Powiązane problemy