面试题答案
一键面试- 统一捕获并处理异常的方法:
- 使用
CompletableFuture
的exceptionally
方法或whenComplete
方法来处理异常。exceptionally
方法专门用于处理异常,而whenComplete
方法可以同时处理正常结果和异常情况。这两个方法都不会影响其他正常任务的执行,因为CompletableFuture
的设计理念就是异步非阻塞,每个任务相对独立。
- 使用
- 代码示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
if (Math.random() < 0.5) {
throw new RuntimeException("Task 1 failed");
}
return 10;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
if (Math.random() < 0.5) {
throw new RuntimeException("Task 2 failed");
}
return 20;
});
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join();// 等待所有任务完成
Integer result1 = future1.exceptionally(ex -> {
System.out.println("Caught exception in future1: " + ex.getMessage());
return -1;
}).join();
Integer result2 = future2.exceptionally(ex -> {
System.out.println("Caught exception in future2: " + ex.getMessage());
return -1;
}).join();
System.out.println("Result of future1: " + result1);
System.out.println("Result of future2: " + result2);
}
}
在上述代码中:
future1
和future2
是两个异步任务,它们都有可能抛出异常。CompletableFuture.allOf(future1, future2)
用于等待所有任务完成。- 使用
exceptionally
方法为每个CompletableFuture
设置异常处理逻辑,在捕获到异常时打印异常信息并返回一个默认值(这里是-1
),这样即使某个任务抛出异常,也不会影响其他任务的执行,并且可以统一处理异常情况。