Maison >Java >javaDidacticiel >Comment gérer les exceptions non interceptées lancées par les threads en 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!