面试题答案
一键面试- 结果和处理流程:
CompletableFuture.anyOf
方法会返回一个新的CompletableFuture
,当任何一个传入的CompletableFuture
完成(正常完成或抛出异常)时,这个新的CompletableFuture
就会完成。如果其中一个任务抛出异常,anyOf
返回的CompletableFuture
也会以该异常完成。
- 代码示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureAnyOfExceptionExample {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
// 模拟一个正常任务
return "Task 1 completed";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
// 模拟一个抛出异常的任务
throw new RuntimeException("Task 2 failed");
});
CompletableFuture<Object> combinedFuture = CompletableFuture.anyOf(future1, future2);
combinedFuture.thenApply(result -> {
System.out.println("Result: " + result);
return result;
}).exceptionally(ex -> {
System.out.println("Caught exception: " + ex.getMessage());
return null;
}).join();
}
}
- 异常传播和处理机制:
- 异常传播:当
future2
抛出异常时,anyOf
返回的combinedFuture
会以这个异常完成。这是因为anyOf
只要有一个CompletableFuture
完成(包括异常完成)就会结束。 - 异常处理:
exceptionally
方法:可以通过exceptionally
方法优雅地捕获异常。在上述代码中,combinedFuture.exceptionally(ex -> {... })
块捕获了anyOf
返回的CompletableFuture
可能抛出的异常,并在控制台打印异常信息。这种方式保证了程序不会因为某个任务的异常而崩溃,增强了程序的健壮性。whenComplete
方法:也可以使用whenComplete
方法来处理异常,它会在CompletableFuture
完成(正常或异常)时执行。示例如下:
- 异常传播:当
combinedFuture.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("Caught exception in whenComplete: " + ex.getMessage());
} else {
System.out.println("Result in whenComplete: " + result);
}
});
handle
方法:handle
方法结合了thenApply
和exceptionally
的功能,它始终会执行,无论CompletableFuture
是正常完成还是异常完成。示例如下:
combinedFuture.handle((result, ex) -> {
if (ex != null) {
System.out.println("Caught exception in handle: " + ex.getMessage());
return null;
} else {
System.out.println("Result in handle: " + result);
return result;
}
}).join();
这些方法都可以有效地捕获和处理CompletableFuture.anyOf
方法中可能出现的异常,确保程序的健壮性。