ホームページ >Java >&#&チュートリアル >エグゼキュータによって実行された SwingWorker タスクからの例外を処理する方法?

エグゼキュータによって実行された SwingWorker タスクからの例外を処理する方法?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-24 10:58:11961ブラウズ

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

Future から ArrayIndexOutOfBoundsException を取得できませんスレッドが Executor を開始する場合は SwingWorker

質問:

によって実行される SwingWorker タスクから ArrayIndexOutOfBoundsException または例外をキャッチする方法Executor?

答え:

SwingWorker の Done() メソッド内からキャッチした例外を再スローします。

詳細説明:

Executor を使用してSwingWorker タスクの場合、タスクは別のスレッドで実行されます。これは、タスクによってスローされた例外は、SwingWorker が実行されているイベント ディスパッチ スレッド (EDT) に伝播されないことを意味します。その結果、タスクによってスローされたキャッチされなかった例外は黙って飲み込まれ、done() メソッドは正常に完了します。

タスクによってスローされた例外をキャッチして処理するには、次の手順を使用できます。

  1. SwingWorker の done() メソッドをオーバーライドします。
  2. done() メソッド内で、 try-catch ブロックは、タスクによってスローされた可能性のある例外をキャッチします。
  3. ExecutionException クラスを使用して、キャッチした例外を再スローします。

次を使用して例外を再スローします。 ExecutionException の場合、EDT に伝播されて戻され、タスクが実行されたときに返された Future の get() メソッドの呼び出し元によって処理できます。

例:

次のコードは、上記の手順を使用して Executor によって実行された SwingWorker タスクによってスローされた例外をキャッチして処理する方法を示しています。

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);
    }
}

これらの手順に従うことで、SwingWorker タスクによって実行された例外をキャッチして処理できます。 Executor。キャッチされなかった例外が黙って見過ごされないようにします。

以上がエグゼキュータによって実行された SwingWorker タスクからの例外を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。