Maison > Java > javaDidacticiel > Comment gérer les exceptions des tâches SwingWorker exécutées par un exécuteur testamentaire ?

Comment gérer les exceptions des tâches SwingWorker exécutées par un exécuteur testamentaire ?

Linda Hamilton
Libérer: 2024-12-24 10:58:11
original
954 Les gens l'ont consulté

How to Handle Exceptions from SwingWorker Tasks Executed by an Executor?

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 :

  1. Remplacez la méthode done() dans SwingWorker.
  2. Dans la méthode done(), utilisez un bloc try-catch pour intercepter toutes les exceptions qui ont pu être levées. par la tâche.
  3. Relancez l'exception interceptée à l'aide de la classe ExecutionException.

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);
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal