Na linguagem Java, as exceções são divididas em duas categorias:
Exceção verificada: Este tipo de exceção deve ser lançada explicitamente na cláusula throws ou capturada no método. Por exemplo, IOException ou ClassNotFoundException.
Exceção não verificada: este tipo de exceção não precisa ser lançada ou capturada explicitamente. Por exemplo, NumberFormatException.
Quando uma exceção verificada é lançada no método run() de um objeto Thread, devemos capturá-la e tratá-la porque o método run() não pode lançar exceções. Quando uma exceção não verificada é lançada no método run() do objeto Thread, o comportamento padrão é imprimir as informações de rastreamento de pilha no console e então sair do programa.
Felizmente, Java nos fornece um mecanismo projetado especificamente para lidar com exceções não verificadas lançadas por objetos Thread para evitar a saída do programa.
Nesta seção, usamos um exemplo para demonstrar esse mecanismo.
saiba disso
Siga as etapas mostradas abaixo para implementar nosso exemplo.
1. Primeiro, precisamos implementar uma classe para tratar exceções não verificadas. Esta classe deve implementar a classe UncaughtExceptionHandler e implementar o método uncaughtException() declarado nesta interface. Neste exemplo, o nome da classe é ExceptionHandler e o método uncaughtException() imprime a exceção e as informações do thread que gerou a exceção. O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública ExceptionHandler implementa Thread.UncaughtExceptionHandler {
@Substituir
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Uma exceção foi capturada //n");
System.out.printf("Tópico: %s/n", t.getId());
System.out.printf("Exceção: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Rastreamento de pilha: /n");
e.printStackTrace(System.out);
System.out.printf("Status do thread: %s/n", t.getState());
}
}
2. Implemente uma classe que possa lançar exceções não verificadas, chamada Task, implemente a interface Runnable, implemente o método run() e, especialmente, codifique um trecho de código que possa gerar exceções não verificadas, por exemplo, converter uma string em um número. O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública Tarefa implementa Runnable {
@Substituir
execução void pública() {
int numero = Integer.parseInt("diguage.com");
}
}
3. Crie a classe principal do programa, a classe Main, e então implemente o método main(). O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública Principal {
public static void main(String[] args) {
4. Crie um objeto Task e crie um objeto Thread para executá-lo. Use o método setUncaughtExceptionHandler() para definir a classe de tratamento para exceções não verificadas. Então, inicie o tópico. O código é o seguinte:
Copie o código do código da seguinte forma:
Tarefa tarefa = new Tarefa();
Thread thread = new Thread(tarefa);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
5. Execute o exemplo e visualize os resultados.
sabe por que
O resultado da execução anormal pode ser visto no trecho de saída abaixo. A exceção é lançada e então capturada pela classe manipuladora e as informações da exceção são impressas no console.
Copie o código do código da seguinte forma:
Uma exceção foi capturada
Tópico: 9
Exceção: java.lang.NumberFormatException: para string de entrada: "diguage.com"
Rastreamento de pilha:
java.lang.NumberFormatException: Para string de entrada: "diguage.com"
em java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
em java.lang.Integer.parseInt(Integer.java:492)
em java.lang.Integer.parseInt(Integer.java:527)
em com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
em java.lang.Thread.run(Thread.java:722)
Status do tópico: EXECUTÁVEL
Processo concluído com código de saída 0
Quando um encadeamento lança uma exceção e a exceção (aqui se refere especificamente a uma exceção não verificada) não é capturada, a máquina virtual Java verifica se a classe de tratamento de exceção não verificada está definida por meio do método correspondente, se tiver sido definido, o método uncaughtException(). e passe o thread e a exceção como parâmetros para o método.
Se nenhuma classe de processamento for definida, a máquina virtual Java imprimirá as informações de rastreamento de pilha no console e sairá do programa.
sem fim
A classe Thread também possui um método relacionado ao tratamento de exceções não verificadas. Este é o método estático setDefaultUncaughtExceptionHandler(), que pode definir a classe de tratamento de exceções não verificada para todos os threads do programa.
Quando uma exceção não detectada é lançada em um encadeamento, a máquina virtual Java procura classes de tratamento de exceções em três locais:
Primeiro, procure a classe de tratamento de exceções do objeto thread, e é isso que aprendemos nesta seção. Se não existir, a classe de tratamento de exceções é pesquisada no grupo de threads (ThreadGroup) onde o thread está localizado. Esta parte será explicada especificamente mais tarde. Se ainda não existir, procure a classe de tratamento de exceções padrão do programa mencionada acima.
Se nenhum dos manipuladores de exceção mencionados acima existir, a máquina virtual Java imprimirá as informações de rastreamento de pilha da exceção no console e sairá do programa.
Usar doutrina
Este artigo foi traduzido do "Java 7 Concurrency Cookbook" (D Gua Ge o roubou como "Java7 Concurrency Sample Collection") e é usado apenas como material de aprendizagem. Não pode ser utilizado para quaisquer fins comerciais sem autorização.
Pequeno sucesso
O código completo da classe ExceptionHandler é o seguinte:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Classe de tratamento de exceção não verificada
* Data: 22/09/2013
* Horário: 23h11
*/
classe pública ExceptionHandler implementa Thread.UncaughtExceptionHandler {
@Substituir
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Uma exceção foi capturada/n");
System.out.printf("Tópico: %s/n", t.getId());
System.out.printf("Exceção: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Rastreamento de pilha: /n");
e.printStackTrace(System.out);
System.out.printf("Status do thread: %s/n", t.getState());
}
}
Código completo da classe Task
Copie o código do código da seguinte forma:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Classe de geração de exceção
* Data: 22/09/2013
* Horário: 23h18
*/
classe pública Tarefa implementa Runnable {
@Substituir
execução void pública() {
int numero = Integer.parseInt("diguage.com");
}
}
O código completo da classe principal
Copie o código do código da seguinte forma:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Classe principal do exemplo
* Data: 22/09/2013
* Horário: 23h20
*/
classe pública Principal {
public static void main(String[] args) {
Tarefa tarefa = new Tarefa();
Thread thread = new Thread(tarefa);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
}
}