关于CompletableFuture的兜底方法exceptionally的问题

关于CompletableFuture的兜底方法exceptionally的问题

CompletableFuture<String> stringFuture = CompletableFuture.supplyAsync(() -> {
            String uuid = UUID.randomUUID().toString();
            System.out.println("内部打印。。。uuid = " + uuid);
//            int a = 1 / 0;
            return uuid;
        }, MyThreadPool.executorService)
                .whenComplete((s, throwable) -> {
                    System.out.println("执行完毕后打印。。。CompleteUUID = " + s);
                    System.out.println(throwable.getMessage());
                })
                .exceptionally(throwable -> {
                    System.out.println(throwable.getMessage());

                    String uuid = UUID.randomUUID().toString();
                    System.out.println("exceptionally兜底打印。。。uuid = " + uuid);

                    return uuid;
                });
        String outUUID = stringFuture.get();

老师,我这边不理解,为什么

stringFuture 要链式调用whenComplete、exceptionally。
为什么stringFuture 分开调用
stringFuture.whenComplete((s, throwable) -> {
    System.out.println("执行完毕后打印。。。CompleteUUID = " + s);
    System.out.println(throwable.getMessage());
});
stringFuture.exceptionally(throwable -> {
    System.out.println(throwable.getMessage());

    String uuid = UUID.randomUUID().toString();
    System.out.println("exceptionally兜底打印。。。uuid = " + uuid);

    return uuid;
});
String outUUID = stringFuture.get();
这样主线程为异常,无法兜底


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

如果分开调用,可能会导致异常。因为异步操作完成时,whenComplete()中的处理函数执行成功,但exceptionally()中的处理函数也执行了,这可能会导致处理函数冲突或重复处理。为了避免异常,最好将whenComplete()和exceptionally()链式调用在一起,以确保异步操作的成功和异常处理逻辑清晰明确。

  • 菲尼克斯_ 提问者 #1

    谢谢老师,我明白了。分开调用whenComplete()、exceptionally() 且异步抛出除0异常导致函数处理冲突了,链式调用可以解决。

    2024-02-28 20:29:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java高级工程师
  • 参与学习       423    人
  • 解答问题       321    个

通过一个大型项目贯穿,掌握主流技术栈,提升技术广度与深度 实现复杂度极高的招聘业务,用户端+企业端+SaaS平台全覆盖 构建技术+业务+工程实战+就业服务闭环,实现从初中级到高级工程师的跨越!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师