« Salut Amigo !

"Je veux te parler de quelque chose de petit, mais intéressant."

"J'écoute. J'aime les choses petites et intéressantes."

"Eh bien, vous savez que chaque objet Thread a une méthode run(). Et que vous pouvez l'exécuter sur un thread séparé en utilisant la méthode start()."

"Oui bien sûr."

"Mais imaginez maintenant cette situation : vous démarrez un thread pour effectuer un travail, mais une exception est levée et le thread s'arrête car il ne sait pas quoi faire. N'auriez-vous pas besoin de connaître cette erreur d'une manière ou d'une autre ?"

"Je suis d'accord. J'aurais besoin d'une manière ou d'une autre d'intercepter l'exception qui s'est produite sur l'autre thread en cours d'exécution. Est-ce que Java le supporte ?"

"Vous m'insultez. Bien sûr que c'est le cas."

"Les créateurs de Java ont inventé une interface spéciale appelée UncaughtExceptionHandler. Voici comment intercepter et gérer une exception qui se produit sur un autre thread, si ce thread ne l'intercepte pas :"

Exemple
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"L'objet Thread a une méthode spéciale setUncaughtExceptionHandler . Vous devez lui passer un objet qui implémente l' interface Thread.UncaughtExceptionHandler . Cette interface n'a qu'une seule méthode : uncaughtException(Thread t, Throwable e) . C'est la méthode qui sera appelée sur l'objet passé si une exception non interceptée se produit dans la méthode run."

"Dans mon exemple ci-dessus, je déclare simplement une classe interne anonyme (surlignée en rouge) qui implémente l' interface Thread. Thread.UncaughtExceptionHandler . Et je remplace sa méthode uncaughtException(Thread t, Throwable e) ."

"Comme vous pouvez le voir dans la liste des paramètres de la méthode, deux arguments seront passés : une référence à l'objet Thread où l'exception s'est produite, et l'exception elle-même, passée en tant que Throwable e."

"Eh bien, pourquoi ai-je besoin de la variable Thread t ? Ne savons-nous pas déjà dans quel Thread nous mettons un objet Thread.UncaughtExceptionHandler ?"

"Ils l'ont fait pour que vous puissiez écrire un gestionnaire universel pour ces situations, c'est-à-dire que vous pouvez créer un seul objet et le transmettre à des dizaines de threads différents. Ensuite, la méthode uncaughtException( Thread t, Throwable e) vous donne toujours une référence à la Objet thread où l'exception s'est produite."

"De plus, vous pouvez créer des dizaines de threads, par exemple, dans une boucle pour effectuer des tâches spécifiques. En général, cette référence à l'objet Thread ne sera pas superflue. Je vous le promets."

"Je te crois. Tu ne t'es jamais trompé."