Dans le langage Java, les exceptions sont divisées en deux catégories :
Exception vérifiée : ce type d'exception doit être explicitement lancé dans la clause throws ou intercepté dans la méthode. Par exemple, IOException ou ClassNotFoundException.
Exception non vérifiée : ce type d'exception n'a pas besoin d'être explicitement lancé ou intercepté. Par exemple, NumberFormatException.
Lorsqu'une exception vérifiée est levée dans la méthode run() d'un objet Thread, nous devons l'attraper et la gérer car la méthode run() ne peut pas lever d'exceptions. Lorsqu'une exception non vérifiée est levée dans la méthode run() de l'objet Thread, le comportement par défaut consiste à imprimer les informations de trace de pile sur la console, puis à quitter le programme.
Heureusement, Java nous fournit un mécanisme spécialement conçu pour gérer les exceptions non contrôlées lancées par les objets Thread afin d'éviter la sortie du programme.
Dans cette section, nous utilisons un exemple pour démontrer ce mécanisme.
je le sais
Suivez les étapes ci-dessous pour mettre en œuvre notre exemple.
1. Tout d’abord, nous devons implémenter une classe pour gérer les exceptions non contrôlées. Cette classe doit implémenter la classe UncaughtExceptionHandler et implémenter la méthode uncaughtException() déclarée dans cette interface. Dans cet exemple, le nom de la classe est ExceptionHandler et la méthode uncaughtException() affiche l'exception et les informations sur le thread qui a généré l'exception. Le code est le suivant :
Copiez le code comme suit :
la classe publique ExceptionHandler implémente Thread.UncaughtExceptionHandler {
@Outrepasser
public void uncaughtException (Thread t, Throwable e) {
System.out.printf("Une exception a été capturée//n");
System.out.printf("Thread : %s/n", t.getId());
System.out.printf("Exception : %s : %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Trace de la pile : /n");
e.printStackTrace(System.out);
System.out.printf("Statut du thread : %s/n", t.getState());
}
}
2. Implémentez une classe capable de générer des exceptions non contrôlées, appelée Task, implémentez l'interface Runnable, implémentez la méthode run() et codez spécialement un morceau de code qui peut générer des exceptions non contrôlées, par exemple, convertir une chaîne en nombre. Le code est le suivant :
Copiez le code comme suit :
La tâche de classe publique implémente Runnable {
@Outrepasser
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
3. Créez la classe principale du programme, la classe Main, puis implémentez la méthode main(). Le code est le suivant :
Copiez le code comme suit :
classe publique Principale {
public static void main (String[] arguments) {
4. Créez un objet Task et créez un objet Thread pour l'exécuter. Utilisez la méthode setUncaughtExceptionHandler() pour définir la classe de gestion des exceptions non vérifiées. Ensuite, démarrez le fil. Le code est le suivant :
Copiez le code comme suit :
Tâche tâche = nouvelle tâche ();
Thread thread = nouveau Thread (tâche);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
5. Exécutez l'exemple et affichez les résultats.
sais pourquoi
Le résultat de l’exécution anormale peut être vu dans l’extrait de sortie ci-dessous. L'exception est levée, puis interceptée par la classe du gestionnaire et les informations sur l'exception sont imprimées sur la console.
Copiez le code comme suit :
Une exception a été capturée
Sujet : 9
Exception : java.lang.NumberFormatException : Pour la chaîne d'entrée : "diguage.com"
Trace de pile :
java.lang.NumberFormatException : pour la chaîne d'entrée : "diguage.com"
à java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
à java.lang.Integer.parseInt(Integer.java:492)
à java.lang.Integer.parseInt(Integer.java:527)
sur com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
sur java.lang.Thread.run(Thread.java:722)
Statut du fil : RUNNABLE
Processus terminé avec le code de sortie 0
Lorsqu'un thread lève une exception et que l'exception (fait spécifiquement référence ici à une exception non vérifiée) n'est pas interceptée, la machine virtuelle Java vérifie si la classe de gestion des exceptions non vérifiées est définie via la méthode correspondante. Si elle a été définie, la méthode uncaughtException(). et transmettez le thread et l’exception en tant que paramètres à la méthode.
Si aucune classe de traitement n'est définie, la machine virtuelle Java imprimera les informations de trace de pile sur la console, puis quittera le programme.
sans fin
La classe Thread possède également une méthode liée à la gestion des exceptions non vérifiées. Il s'agit de la méthode statique setDefaultUncaughtExceptionHandler(), qui peut définir la classe de gestion des exceptions non vérifiée pour tous les threads du programme.
Lorsqu'une exception non interceptée est levée dans un thread, la machine virtuelle Java recherche les classes de gestion des exceptions à trois endroits :
Tout d’abord, recherchez la classe de gestion des exceptions dans l’objet thread, et c’est ce que nous avons appris dans cette section. Si elle n'existe pas, la classe de gestion des exceptions est recherchée à partir du groupe de threads (ThreadGroup) où se trouve le thread. Cette partie sera expliquée spécifiquement plus tard. Si elle n’existe toujours pas, recherchez la classe de gestion des exceptions par défaut du programme mentionnée ci-dessus.
Si aucun des gestionnaires d'exceptions mentionnés ci-dessus n'existe, la machine virtuelle Java imprime les informations de trace de pile de l'exception sur la console, puis quitte le programme.
Utiliser la doctrine
Cet article est traduit du "Java 7 Concurrency Cookbook" (D Gua Ge l'a volé sous le nom de "Java7 Concurrency Sample Collection") et n'est utilisé que comme matériel d'apprentissage. Il ne peut être utilisé à des fins commerciales sans autorisation.
Petit succès
Le code complet de la classe ExceptionHandler est le suivant :
package com.diguage.books.concurrencycookbook.chapter1.recipe8 ;
/**
* Classe de gestion des exceptions non cochée
* Date : 2013-09-22
* Heure : 23h11
*/
la classe publique ExceptionHandler implémente Thread.UncaughtExceptionHandler {
@Outrepasser
public void uncaughtException (Thread t, Throwable e) {
System.out.printf("Une exception a été capturée/n");
System.out.printf("Thread : %s/n", t.getId());
System.out.printf("Exception : %s : %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("Trace de la pile : /n");
e.printStackTrace(System.out);
System.out.printf("Statut du thread : %s/n", t.getState());
}
}
Code complet de la classe Task
Copiez le code comme suit :
package com.diguage.books.concurrencycookbook.chapter1.recipe8 ;
/**
* Classe de génération d'exceptions
* Date : 2013-09-22
* Heure : 23h18
*/
La tâche de classe publique implémente Runnable {
@Outrepasser
public void run() {
int numero = Integer.parseInt("diguage.com");
}
}
Le code complet de la classe Main
Copiez le code comme suit :
package com.diguage.books.concurrencycookbook.chapter1.recipe8 ;
/**
* Classe principale d'exemple
* Date : 2013-09-22
* Heure : 23h20
*/
classe publique Principale {
public static void main (String[] arguments) {
Tâche tâche = nouvelle tâche ();
Thread thread = nouveau Thread (tâche);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();
}
}