在 java 异常处理中,`executionexception` 是 `java.util.concurrent.executionexception` 的实例,通常在使用 `future.get()` 或 `completablefuture.join()` 时抛出。它表示异步任务执行过程中发生了异常。处理该异常的关键在于使用 `getcause()` 方法获取原始异常,并根据原始异常的类别进行针对性处理,而不是直接处理 `executionexception` 本身。

Future.get() 捕获 ExecutionException 后如何获取原始异常?
当调用 Future.get() 时,如果线程池中的任务抛出了非 RuntimeException 的异常,get() 方法会将其包装在 ExecutionException 中抛出。要获取原始异常,必须调用 e.getCause()。这个返回的对象就是任务内部实际抛出的那个异常实例。开发者需要检查这个 Cause 的类型,例如判断它是否是 NullPointerException 或自定义的业务异常,从而决定重试、记录日志还是返回默认值。

import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
throw new IllegalArgumentException("Task failed");
});
try {
String result = future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("Interrupted: " + e.getMessage());
} catch (ExecutionException e) {
Throwable cause = e.getCause();
if (cause instanceof IllegalArgumentException) {
System.out.println("Caught original exception: " + cause.getMessage());
} else {
System.out.println("Unknown error: " + cause.getMessage());
}
}
executor.shutdown();
}
}运行上述代码,控制台将输出:Caught original exception: Task failed。这证明了通过 getCause() 可以准确拿到 IllegalArgumentException 实例。如果任务抛出的是 RuntimeException,同样会被包装,处理方式一致。注意不要忽略 InterruptedException,它表示线程被中断,通常需要恢复中断状态。
立即学习“Java免费学习笔记(深入)”;
CompletableFuture 中 exceptionally() 如何处理 ExecutionException?
在使用 CompletableFuture 时,推荐链式调用 exceptionally() 来处理异常,而不是在 join() 处使用 try-catch。exceptionally() 接收一个函数,该函数的参数是 Throwable。在这个回调中,传入的异常对象通常是 CompletionException(它是 ExecutionException 的子类),其 cause 才是原始异常。这种方式允许你在不阻塞主线程的情况下提供默认值或备用逻辑,保持代码的流畅性。

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Async failure");
}).exceptionally(ex -> {
Throwable cause = ex.getCause();
if (cause != null && cause instanceof RuntimeException) {
return "Fallback value";
}
return "Default fallback";
});
System.out.println(future.join());
}
}运行结果输出:Fallback value。这里 ex 是 CompletionException,通过 getCause() 获取到内部的 RuntimeException。这种模式避免了显式的异常捕获块,使异步流程更清晰。如果不需要区分具体异常类型,可以直接返回一个静态默认值,如 return


















