ホームページ >Java >&#&チュートリアル >エグゼキュータによって実行された SwingWorker タスクからの例外を処理する方法?
Future から ArrayIndexOutOfBoundsException を取得できません>スレッドが Executor を開始する場合は SwingWorker
質問:
によって実行される SwingWorker タスクから ArrayIndexOutOfBoundsException または例外をキャッチする方法Executor?
答え:
SwingWorker の Done() メソッド内からキャッチした例外を再スローします。
詳細説明:
Executor を使用してSwingWorker タスクの場合、タスクは別のスレッドで実行されます。これは、タスクによってスローされた例外は、SwingWorker が実行されているイベント ディスパッチ スレッド (EDT) に伝播されないことを意味します。その結果、タスクによってスローされたキャッチされなかった例外は黙って飲み込まれ、done() メソッドは正常に完了します。
タスクによってスローされた例外をキャッチして処理するには、次の手順を使用できます。
次を使用して例外を再スローします。 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 サイトの他の関連記事を参照してください。