Uma dúvida: se eu tenho 2 Threads rodando e em uma delas eu lançar uma exception (que não é tratada em lugar nenhum), ela vai arrear a app inteira ou só a thread em que foi lançada?
Meu palpite é que, como a pilha de execução de métodos é diferente da Thread original, somente a thread que lançou a exceção irá abbendar.
Gostaria de ouvir (ler) alguma outra opinião sobre isso.
Agora se vc lida com exceções não checadas, apenas a thread que a lançou morre!
publicclassContaimplementsRunnable{publicvoidrun(){this.algo();}publicvoidalgo()throwsRuntimeException{thrownewRuntimeException("Ae");}publicstaticvoidmain(String[]args){Threadt1=newThread(newConta());t1.start();try{t1.join();//só terminaremos a main depois que a thread terminar}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("Continuando");}}
ok?
E
entanglement
Só como comentário, é por isso que você tem de capturar toda e qualquer exceção em uma rotina chamada por um javax.swing.Timer ou por um java.util.Timer. Se você não fizer isso, como os timers são implementados através de uma thread, a thread do timer acaba “caindo” (sem derrubar a aplicação inteira) e o timer parece que “parou”.
ViniGodoy
Uma boa política também é registrar um uncaughtExceptionHandler para sua aplicação. Ele pelo menos fará o log da exception não capturada, antes da thread morrer. Para fazer isso, faça:
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
//Faça o log do throwable não capturado aqui. Provavelmente uma runtime exception ou um error
}
});
Se sua aplicação for um servlet, ou rodar num servidor, provavelmente o servidor já terá feito isso para você, e terá um log próprio.
Mas se for uma aplicação Swing ou um Applet, fica aí a dica.