Maison >Java >javaDidacticiel >Comment gérer les exceptions non interceptées lancées par les threads en Java ?

Comment gérer les exceptions non interceptées lancées par les threads en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 09:52:10985parcourir

How to Handle Uncaught Exceptions Thrown by Threads in Java?

Capture des exceptions levées par les threads

En Java, lorsqu'un nouveau thread est créé, il exécute sa méthode run() en même temps que le thread principal fil de discussion. Cependant, les exceptions levées dans un thread ne peuvent pas être directement gérées dans la classe principale.

Considérez le code suivant :

public class Test extends Thread {
  public static void main(String[] args) throws InterruptedException {
    Test t = new Test();

    try {
      t.start();
      t.join();
    } catch(RuntimeException e) {
      System.out.println("** RuntimeException from main");
    }

    System.out.println("Main stopped");
  }

  @Override
  public void run() {
    try {
      while(true) {
        System.out.println("** Started");

        sleep(2000);

        throw new RuntimeException("exception from thread");
      }
    } catch (RuntimeException e) {
      System.out.println("** RuntimeException from thread");

      throw e;
    } catch (InterruptedException e) {

    }
  }
}

Dans ce code, une exception d'exécution est levée depuis le thread, mais il n'est pas capturé dans la classe principale. Pour résoudre ce problème, Java fournit un mécanisme pratique appelé Thread.UncaughtExceptionHandler.

Utilisation de Thread.UncaughtExceptionHandler

Un Thread.UncaughtExceptionHandler fournit un moyen de gérer les exceptions qui sont pas pris dans un fil. Pour l'utiliser, attribuez un gestionnaire au thread à l'aide de setUncaughtExceptionHandler() et remplacez sa méthode uncaughtException() pour définir la logique de gestion des exceptions.

Voici un exemple :

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread th, Throwable ex) {
        System.out.println("Uncaught exception: " + ex);
    }
};
Thread t = new Thread() {
    @Override
    public void run() {
        System.out.println("Sleeping ...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted.");
        }
        System.out.println("Throwing exception ...");
        throw new RuntimeException();
    }
};
t.setUncaughtExceptionHandler(h);
t.start();

Dans ce code, le gestionnaire imprime l’exception non interceptée sur la console. En utilisant Thread.UncaughtExceptionHandler, les exceptions levées dans un thread peuvent être gérées efficacement dans la classe principale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn