面试题答案
一键面试在CompletableFuture
链式调用中处理异常并保证后续操作继续执行,可以使用exceptionally
方法来捕获异常,并返回一个默认值或者执行其他逻辑,同时不影响后续的异步操作。以下是一个详细的代码示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 模拟第一步异步操作
System.out.println("Step 1 started");
if (Math.random() < 0.5) {
throw new RuntimeException("Step 1 failed");
}
return "Step 1 result";
})
.thenApply(result -> {
// 模拟第二步异步操作
System.out.println("Step 2 started with result: " + result);
return "Step 2 processed: " + result;
})
.exceptionally(ex -> {
// 捕获第一步的异常
System.out.println("Caught exception in Step 1: " + ex.getMessage());
return "Default value due to Step 1 failure";
})
.thenApply(result -> {
// 这一步会继续执行,无论第一步是否成功
System.out.println("Step 3 started with result: " + result);
return "Step 3 processed: " + result;
})
.thenAccept(System.out::println)
.join();
}
}
在上述代码中:
supplyAsync
方法开始第一步异步操作,这里可能会抛出异常。thenApply
方法进行第二步异步操作,依赖第一步的结果。exceptionally
方法捕获第一步可能抛出的异常,并返回一个默认值。- 后续的
thenApply
和thenAccept
方法会继续执行,不受第一步异常的影响,因为exceptionally
方法已经处理了异常并提供了一个替代值。
通过这种方式,即使链式调用中的某一步抛出异常,后续的异步操作依然可以按照逻辑继续执行。