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?
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?
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());
"Sonst behandelt die JVM es." Um genauer zu sein, der Thread, der die Ausnahme ausgelöst hat, stirbt still. –
@Stephen: Tatsächlich druckt es die Ausnahme zu stderr. – Draemon
Wirklich? Es muss dann JVM-spezifisch sein ... weil ich durch das Fehlen einer Stack-Trace ausgelöst wurde. –
Es kann, wenn Sie es einer ThreadGroup zuweisen, die die uncaughtException(Thread, Throwable) Methode implementiert.
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())
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