MST

星途 面试题库

面试题:Java CompletableFuture whenComplete异常处理机制

当CompletableFuture的任务执行过程中抛出异常时,whenComplete方法如何处理这种情况?如果在whenComplete中再次抛出异常,会发生什么?请结合代码说明。
36.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. whenComplete方法处理异常情况
    • whenComplete方法会在任务(无论是正常完成还是异常完成)结束时执行。它接收两个参数,第一个参数是任务的结果(如果任务正常完成),第二个参数是任务执行过程中抛出的异常(如果有异常发生)。
    • 示例代码如下:
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() > 0.5) {
                throw new RuntimeException("Simulated exception");
            }
            return "Task completed successfully";
        }).whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("Exception occurred: " + ex.getMessage());
            } else {
                System.out.println("Result: " + result);
            }
        });
    }
}
  • 在上述代码中,supplyAsync方法异步执行一个任务,任务有50%的概率抛出异常。whenComplete方法在任务结束时被调用,根据ex是否为null来判断任务是否异常完成,并进行相应处理。
  1. whenComplete中再次抛出异常的情况
    • 如果在whenComplete中再次抛出异常,这个异常不会被CompletableFuture本身捕获和处理,它会像普通的未捕获异常一样传播。如果没有其他的异常处理机制,程序可能会终止。
    • 示例代码如下:
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExceptionInWhenComplete {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> "Task completed successfully")
               .whenComplete((result, ex) -> {
                    throw new RuntimeException("Exception in whenComplete");
                });
    }
}
  • 在上述代码中,supplyAsync任务正常完成,但在whenComplete中抛出了一个新的异常。这个异常没有被CompletableFuture处理,会导致程序终止并在控制台打印异常堆栈信息。通常在实际应用中,建议在whenComplete中正确处理异常,而不是再次抛出异常,以避免程序异常终止。