MST

星途 面试题库

面试题:Java中CompletableFuture的supplyAsync方法如何处理异常

在使用Java CompletableFuture的supplyAsync方法进行任务调度时,假设任务执行过程中可能抛出异常。请描述如何捕获并处理这些异常,列举至少两种处理异常的方式,并给出相应的代码示例。
34.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

方式一:使用exceptionally方法

通过exceptionally方法可以在任务出现异常时返回一个默认值。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("模拟异常");
            }
            return "任务正常执行结果";
        })
       .exceptionally(ex -> {
            System.out.println("捕获到异常: " + ex.getMessage());
            return "默认值";
        })
       .thenAccept(System.out::println);
    }
}

方式二:使用whenComplete方法

whenComplete方法可以在任务完成(无论是正常完成还是异常完成)时执行指定的操作,可通过判断是否有异常来处理。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExceptionHandling2 {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("模拟异常");
            }
            return "任务正常执行结果";
        })
       .whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("捕获到异常: " + ex.getMessage());
            } else {
                System.out.println("任务正常执行,结果: " + result);
            }
        });
    }
}

方式三:使用handle方法

handle方法结合了whenCompletethenApply的功能,在任务完成时返回一个新的结果,无论任务是正常完成还是异常完成。

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExceptionHandling3 {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("模拟异常");
            }
            return "任务正常执行结果";
        })
       .handle((result, ex) -> {
            if (ex != null) {
                System.out.println("捕获到异常: " + ex.getMessage());
                return "默认值";
            }
            return result;
        })
       .thenAccept(System.out::println);
    }
}