2009-07-28 8 views
11

Wenn ich die run() -Methode für einen Thread aufruft und die run() -Methode eine nicht abgefangene Exception auslöst, was wäre das Ergebnis?Was passiert, wenn ein Thread eine Exception auslöst?

Wer fängt diese Ausnahme? Wird es überhaupt erwischt?

+5

Um dies zu verdeutlichen - Sie rufen run() nicht auf - rufen Sie start() auf dem Thread auf, um den Code in der run() -Methode in einem neuen auszuführen Faden. Wenn run() direkt aufgerufen wird, wird die run-Methode im aktuellen Thread ausgeführt. – Nate

Antwort

8

Wenn für die ThreadGroup ein Ausnahmebehandler installiert ist, übergibt die JVM die Ausnahme an sie. Wenn es sich um einen AWT-Thread handelt, können Sie einen Ereignishandler für ansonsten nicht behandelte Ausnahmen installieren. Sonst wird es von der JVM gehandhabt.

Beispiel einer Thread-Gruppe mit einem benutzerdefinierten Handler und wie es zu benutzen:

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

Beispiel für einen AWT Exception-Handler mit:

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

"Sonst behandelt die JVM es." Um genauer zu sein, der Thread, der die Ausnahme ausgelöst hat, stirbt still. –

+0

@Stephen: Tatsächlich druckt es die Ausnahme zu stderr. – Draemon

+0

Wirklich? Es muss dann JVM-spezifisch sein ... weil ich durch das Fehlen einer Stack-Trace ausgelöst wurde. –

1

Wenn Sie die Runnable zu einem eingereicht haben ExecutorService können Sie die Ausnahme wie in einem ExecutionException verpackt fangen. (Sehr zu empfehlen über den Aufruf von run())

Verwandte Themen