Exception numa Thread

3 respostas
Link_pg

Olá!

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.

Abraços

3 Respostas

renamed
Na verdade vc é "obrigado" a tratar exceções checadas.
public class Conta implements Runnable{
	
	public void run(){
		this.algo(); //erro aqui
	}
	
	public void algo() throws Exception{
		throw new Exception ("Ae");
	}
}
Agora se vc lida com exceções não checadas, apenas a thread que a lançou morre!
public class Conta implements Runnable{
	
	public void run(){
		this.algo(); 
	}
	
	public void algo() throws RuntimeException{
		throw new RuntimeException ("Ae");
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Conta());
		t1.start();
		try {
			t1.join(); //só terminaremos a main depois que a thread terminar
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Continuando");
	}
}

ok?

E

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.

Criado 15 de janeiro de 2010
Ultima resposta 15 de jan. de 2010
Respostas 3
Participantes 4