2009-07-28 20 views
11

Se invoco il metodo run() su un thread e il metodo run() genera un'eccezione non rilevata quale sarebbe l'esito?cosa succede quando una discussione genera un'eccezione?

Chi intercetta questa eccezione? Viene anche preso?

+5

Per rendere questo più chiaro - non si richiama run() - si chiama start() sul Thread per fare in modo che il codice nel metodo run() venga eseguito in un nuovo filo. Invocare run() direttamente rende solo il metodo run eseguito nel thread corrente. – Nate

risposta

8

Se è presente un gestore di eccezioni installato per il ThreadGroup, la JVM inoltra l'eccezione ad essa. Se si tratta di un thread AWT, è possibile installare un gestore eventi per eccezioni altrimenti non gestite. Altrimenti la JVM lo gestisce.

Esempio di un gruppo di thread con un gestore personalizzato e come usarlo:

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

Esempio di utilizzo di un gestore di eccezioni 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

"Altrimenti la JVM lo gestisce." Per essere più precisi, il thread che ha generato l'eccezione morirà silenziosamente. –

+0

@Stephen: in realtà stampa l'eccezione su stderr. – Draemon

+0

Davvero? Deve essere specifico per JVM ... perché sono stato bloccato dall'assenza di una traccia dello stack. –

1

Se hai inviato la Runnable a un ExecutorService è possibile catturare l'eccezione come racchiusa all'interno di un ExecutionException. (Consigliato semplicemente chiamando run())

Problemi correlati