En el lenguaje Java, las excepciones se dividen en dos categorías:
Excepción marcada: este tipo de excepción debe lanzarse explícitamente en la cláusula throws o capturarse dentro del método. Por ejemplo, IOException o ClassNotFoundException.
Excepción no marcada: no es necesario lanzar ni detectar este tipo de excepción explícitamente. Por ejemplo, NumberFormatException.
Cuando se lanza una excepción marcada en el método run() de un objeto Thread, debemos detectarla y manejarla porque el método run() no puede lanzar excepciones. Cuando se produce una excepción no marcada en el método run() del objeto Thread, el comportamiento predeterminado es imprimir la información de seguimiento de la pila en la consola y luego salir del programa.
Afortunadamente, Java nos proporciona un mecanismo diseñado específicamente para manejar excepciones no comprobadas lanzadas por objetos Thread para evitar la salida del programa.
En esta sección, utilizamos un ejemplo para demostrar este mecanismo.
lo sabes
Siga los pasos que se muestran a continuación para implementar nuestro ejemplo.
1. Primero, necesitamos implementar una clase para manejar excepciones no verificadas. Esta clase debe implementar la clase UncaughtExceptionHandler e implementar el método uncaughtException() declarado en esta interfaz. En este ejemplo, el nombre de la clase es ExceptionHandler y el método uncaughtException() imprime la excepción y la información del hilo que generó la excepción. El código es el siguiente:
Copie el código de código de la siguiente manera:
clase pública ExceptionHandler implementa Thread.UncaughtExceptionHandler {
@Anular
public void uncaughtException (Subproceso t, Lanzable e) {
System.out.printf("Se ha capturado una excepción//n");
System.out.printf("Subproceso: %s/n", t.getId());
System.out.printf("Excepción: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Seguimiento de pila: /n");
e.printStackTrace(System.out);
System.out.printf("Estado del hilo: %s/n", t.getState());
}
}
2. Implemente una clase que pueda generar excepciones no verificadas, llamada Task, implemente la interfaz Runnable, implemente el método run() y codifique especialmente un fragmento de código que pueda generar excepciones no verificadas, por ejemplo, convertir una cadena en un número. El código es el siguiente:
Copie el código de código de la siguiente manera:
La tarea de clase pública implementa Runnable {
@Anular
ejecución pública vacía() {
int numero = Integer.parseInt("diguage.com");
}
}
3. Cree la clase principal del programa, la clase Main, y luego implemente el método main(). El código es el siguiente:
Copie el código de código de la siguiente manera:
clase pública principal {
público estático vacío principal (String [] argumentos) {
4. Cree un objeto Tarea y cree un objeto Hilo para ejecutarlo. Utilice el método setUncaughtExceptionHandler() para configurar la clase de manejo para excepciones no comprobadas. Entonces, inicia el hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
Tarea tarea = nueva Tarea();
Hilo hilo = nuevo hilo (tarea);
thread.setUncaughtExceptionHandler (nuevo ExceptionHandler());
hilo.start();
5. Ejecute el ejemplo y vea los resultados.
saber por qué
El resultado de la ejecución anormal se puede ver en el fragmento de salida a continuación. La excepción se genera, luego la clase de controlador la detecta y la información de la excepción se imprime en la consola.
Copie el código de código de la siguiente manera:
Se ha capturado una excepción.
Tema: 9
Excepción: java.lang.NumberFormatException: para cadena de entrada: "diguage.com"
Seguimiento de pila:
java.lang.NumberFormatException: para cadena de entrada: "diguage.com"
en java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
en java.lang.Integer.parseInt(Integer.java:492)
en java.lang.Integer.parseInt(Integer.java:527)
en com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
en java.lang.Thread.run(Thread.java:722)
Estado del hilo: EJECUTABLE
Proceso finalizado con código de salida 0
Cuando un subproceso genera una excepción y la excepción (aquí se refiere específicamente a una excepción no verificada) no se detecta, la máquina virtual Java verifica si la clase de manejo de excepciones no verificadas está configurada mediante el método correspondiente, si se ha configurado, el método uncaughtException (). y pasar el hilo y la excepción como parámetros al método.
Si no se establece ninguna clase de procesamiento, la máquina virtual Java imprimirá la información de seguimiento de la pila en la consola y luego saldrá del programa.
interminable
La clase Thread también tiene un método relacionado con el manejo de excepciones no controladas. Este es el método estático setDefaultUncaughtExceptionHandler(), que puede establecer la clase de manejo de excepciones no verificadas para todos los subprocesos del programa.
Cuando se lanza una excepción no detectada en un hilo, la máquina virtual Java busca clases de manejo de excepciones desde tres lugares:
Primero, busque la clase de manejo de excepciones del objeto hilo, y eso es lo que aprendimos en esta sección. Si no existe, la clase de manejo de excepciones se busca en el grupo de subprocesos (ThreadGroup) donde se encuentra el subproceso. Esta parte se explicará específicamente más adelante. Si todavía no existe, busque la clase de manejo de excepciones predeterminada del programa que se acaba de mencionar anteriormente.
Si ninguno de los controladores de excepciones mencionados anteriormente existe, la máquina virtual Java imprime la información de seguimiento de la pila de excepciones en la consola y luego sale del programa.
Usar doctrina
Este artículo está traducido del "Libro de cocina de concurrencia de Java 7" (D Gua Ge lo robó como "Colección de ejemplos de concurrencia de Java 7") y solo se utiliza como material de aprendizaje. No puede utilizarse con fines comerciales sin autorización.
Pequeño éxito
El código completo de la clase ExceptionHandler es el siguiente:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Clase de manejo de excepciones no marcada
* Fecha: 2013-09-22
* Hora: 23:11
*/
clase pública ExceptionHandler implementa Thread.UncaughtExceptionHandler {
@Anular
public void uncaughtException (Subproceso t, Throwable e) {
System.out.printf("Se ha capturado una excepción/n");
System.out.printf("Subproceso: %s/n", t.getId());
System.out.printf("Excepción: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Seguimiento de pila: /n");
e.printStackTrace(System.out);
System.out.printf("Estado del hilo: %s/n", t.getState());
}
}
Código completo de la clase Task
Copie el código de código de la siguiente manera:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Clase de generación de excepción
* Fecha: 2013-09-22
* Hora: 23:18
*/
La tarea de clase pública implementa Runnable {
@Anular
ejecución pública vacía() {
int numero = Integer.parseInt("diguage.com");
}
}
El código completo de la clase principal.
Copie el código de código de la siguiente manera:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe8;
/**
* Clase principal de ejemplo
* Fecha: 2013-09-22
* Hora: 23:20
*/
clase pública principal {
público estático vacío principal (String [] argumentos) {
Tarea tarea = nueva Tarea();
Hilo hilo = nuevo hilo (tarea);
thread.setUncaughtExceptionHandler (nuevo ExceptionHandler());
hilo.start();
}
}