Home >Java >javaTutorial >How to Handle Exceptions from SwingWorker Tasks Executed by an Executor?
Can't get ArrayIndexOutOfBoundsException from Future> and SwingWorker if thread starts Executor
Question:
How to catch ArrayIndexOutOfBoundsException or any exception from a SwingWorker task executed by an Executor?
Answer:
By re-throwing the caught exception from within the done() method of the SwingWorker.
Detailed Explanation:
When using an Executor to start a SwingWorker task, the task is executed on a separate thread. This means that any exceptions thrown by the task will not be propagated back to the event dispatch thread (EDT) where the SwingWorker is running. As a result, uncaught exceptions thrown by the task will be silently swallowed and the done() method will complete normally.
To catch and handle exceptions thrown by the task, you can use the following steps:
By re-throwing the exception using ExecutionException, it will be propagated back to the EDT and can be handled by the caller of the get() method on the Future that was returned when the task was submitted.
EXAMPLE:
The following code demonstrates how to catch and handle exceptions thrown by a SwingWorker task executed by an Executor using the steps outlined above:
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); } }
By following these steps, you can catch and handle exceptions thrown by SwingWorker tasks executed by an Executor, ensuring that uncaught exceptions do not go silently unnoticed.
The above is the detailed content of How to Handle Exceptions from SwingWorker Tasks Executed by an Executor?. For more information, please follow other related articles on the PHP Chinese website!