Impossible d'obtenir l'exception ArrayIndexOutOfBoundsException de Future> et SwingWorker si le thread démarre Executor
Question :
Comment intercepter ArrayIndexOutOfBoundsException ou toute exception d'une tâche SwingWorker exécutée par un Exécuteur ?
Réponse :
En relançant l'exception interceptée depuis la méthode done() du SwingWorker.
Détaillé Explication :
Lors de l'utilisation d'un exécuteur pour démarrer une tâche SwingWorker, la tâche est exécuté sur un thread séparé. Cela signifie que les exceptions levées par la tâche ne seront pas propagées au thread de répartition d'événements (EDT) où SwingWorker est exécuté. Par conséquent, les exceptions non interceptées levées par la tâche seront avalées silencieusement et la méthode done() se terminera normalement.
Pour intercepter et gérer les exceptions levées par la tâche, vous pouvez suivre les étapes suivantes :
En relançant l'exception à l'aide d'ExecutionException, elle sera propagée à l'EDT et pourra être géré par l'appelant de la méthode get() sur le Future qui a été renvoyé lorsque la tâche a été soumis.
EXEMPLE :
Le code suivant montre comment intercepter et gérer les exceptions levées par une tâche SwingWorker exécutée par un exécuteur en utilisant les étapes décrites ci-dessus :
import java.util.concurrent.Executor; import java.util.concurrent.Executors; import javax.swing.SwingWorker; public class TableWithExecutor { private static final Executor executor = Executors.newCachedThreadPool(); public static void main(String[] args) { SwingWorker<Void, Void> worker = new SwingWorker<>() { @Override protected Void doInBackground() throws Exception { // Perform some task that may throw an exception ... // Re-throw any caught exceptions using ExecutionException throw new ExecutionException(new Exception("Error occurred in doInBackground()"), null); } @Override protected void done() { try { get(); // Will throw the re-thrown ExecutionException } catch (ExecutionException e) { // Handle the exception here e.printStackTrace(); } catch (InterruptedException e) { // Handle the interruption here e.printStackTrace(); } } }; executor.execute(worker); } }
En suivant ces étapes, vous pouvez intercepter et gérer les exceptions levées par les tâches SwingWorker exécutées par un exécuteur, en vous assurant que les exceptions non interceptées ne disparaissent pas. silencieusement inaperçu.
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!