在Java中如何处理CompletableFuture异常

使用exceptionally、handle、whenComplete等方法处理CompletableFuture异常,确保异步异常不被忽略。1. exceptionally提供默认值;2. handle统一处理结果和异常;3. 在回调链中通过exceptionally捕获中间异常;4. whenComplete用于日志或清理。优先用handle获得完整控制,避免异常丢失。

在java中如何处理completablefuture异常

在Java中使用CompletableFuture进行异步编程时,异常处理是关键的一环。由于异步任务可能在后台线程中执行,未捕获的异常不会直接抛出到主线程,容易被忽略。因此,必须显式地处理异常,以确保程序的健壮性。

1. 使用 exceptionally 方法捕获异常

该方法用于在发生异常时提供一个备选结果,类似于 try-catch 中的 catch 块。

它接收一个函数,当原始 CompletableFuture 发生异常时,会调用这个函数,并返回一个新的 CompletableFuture。

CompletableFuture future = CompletableFuture    .supplyAsync(() -> {        if (true) throw new RuntimeException("Something went wrong");        return "Hello";    })    .exceptionally(ex -> {        System.out.println("Caught exception: " + ex.getMessage());        return "Fallback value";    });System.out.println(future.join()); // 输出: Fallback value  

2. 使用 handle 方法统一处理结果和异常

handle 比 exceptionally 更灵活,无论是否发生异常都会执行,接收两个参数:结果和异常。

立即学习“Java免费学习笔记(深入)”;

适用于需要根据结果或异常做不同处理的场景。

CompletableFuture future = CompletableFuture    .supplyAsync(() -> {        return 10 / 0; // 抛出 ArithmeticException    })    .handle((result, ex) -> {        if (ex != null) {            System.out.println("Error occurred: " + ex.getMessage());            return "Recovered from error";        }        return "Result: " + result;    });System.out.println(future.join()); // 输出: Recovered from error  

3. 在回调中处理异常(如 thenApply、thenAccept)

如果在 thenApply 等链式操作中抛出异常,该异常也会被封装。可以在后续使用 exceptionally 或 handle 捕获。

CompletableFuture future = CompletableFuture    .completedFuture("5")    .thenApply(s -> Integer.parseInt(s))    .thenApply(num -> num / 0) // 异常在此处抛出    .exceptionally(ex -> {        System.out.println("In chain error: " + ex.getCause().getMessage());        return -1;    });System.out.println(future.join()); // 输出: -1  

4. 主动监听异常 —— 使用 whenComplete

该方法用于副作用处理,比如日志记录或资源清理,不改变结果值。

它接收结果和异常,但返回的 CompletableFuture 仍保留原始的结果或异常。

CompletableFuture future = CompletableFuture    .supplyAsync(() -> {        throw new RuntimeException("Oops!");    })    .whenComplete((result, ex) -> {        if (ex != null) {            System.out.println("Logging failure: " + ex.getMessage());        } else {            System.out.println("Success: " + result);        }    })    .exceptionally(ex -> "Default");System.out.println(future.join()); // 输出: Default  

基本上就这些。关键是别让异常在异步流中“消失”。优先使用 handle 获取完整控制,用 exceptionally 提供默认值,用 whenComplete 做清理或日志。不复杂,但容易忽略。

以上就是在Java中如何处理CompletableFuture异常的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/35147.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
mysql中dml是什么 mysql数据操作语言解析
上一篇 2026年10月20日 21:33:19
HTML如何制作数独游戏?数字填充怎么校验?
下一篇 2025年12月22日 13:10:38

相关推荐

  • 正版steam手机版 正版Steam手机版官方下载入口 APP访问地址

    正版steam手机版 正版Steam手机版官方下载入口 APP访问地址正版steam手机版 正版Steam手机版官方下载入口 APP访问地址正版steam手机版 正版Steam手机版官方下载入口 APP访问地址正版steam手机版 正版Steam手机版官方下载入口 APP访问地址

    1、通过App Store或Google Play搜索Steam并确认开发商为Valve进行下载;2、访问Steam官网底部链接跳转至应用商店安装;3、使用Steam桌面客户端设置中的二维码功能扫码获取下载页面,确保安全安装正版应用。 如果您希望在移动设备上管理您的游戏库、与好友聊天或浏览Steam…

    2026年10月20日 • 用户投稿
    1000
  • Java自定义注解参数中枚举与接口结合的灵活设计

    Java自定义注解参数中枚举与接口结合的灵活设计Java自定义注解参数中枚举与接口结合的灵活设计Java自定义注解参数中枚举与接口结合的灵活设计Java自定义注解参数中枚举与接口结合的灵活设计

    本文探讨了在Java自定义注解中,如何优雅地将实现特定接口的枚举作为参数。针对注解参数不支持联合类型的限制,提出了一种通过引入中间值源接口(`MyInterfaceValueSource`)的解决方案。该方案不仅解决了枚举值作为接口类型集合传递的问题,还提升了注解的灵活性和可扩展性,使其能够支持非枚…

    2026年10月20日 • 用户投稿
    800
  • 《星球大战:前线2》Steam 1折促销 在线突破新纪录

    《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录

    ea于2017年11月推出的3a级经典游戏《星球大战:前线2》,其在steam平台的同时在线人数今天再次创下新高。就在10小时之前,本作的steam在线玩家数量突破了2万人(20311人),目前在线人数为16611人。 事实上,早在今年5月份,在忠实粉丝群体的推动下,《星球大战:前线2》的Steam…

    2026年10月20日 • 用户投稿
    1000
  • 数组置换检查:递归的局限性与高效解决方案

    数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案

    本文深入探讨了如何判断两个整数数组是否互为置换。通过分析递归算法的核心原则,我们揭示了直接使用递归解决此问题时面临的效率挑战,特别是涉及状态修改(如元素移除)时的性能开销。文章随后提出并详细解释了一种更高效、基于排序的解决方案,该方法具有显著的性能优势,并提供了具体的代码示例和最佳实践建议。 在编程…

    2026年10月20日 • 用户投稿
    000
  • 大立光2024年资本支出冲新高后 2025年可能下滑

    大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 手机镜头巨头大立光2024年资本支出首破百亿新台币大关,达到107亿新台币,同比增长25%,创下历史新高。然而,大立光董事长林恩平在1月份的法说会上表示,新厂将于今年9月竣工,但未提及设备搬迁计…

    2026年10月20日 • 用户投稿
    500
  • 小米YU7官宣!6月26日与小米Flip 2等新品一同发布

    小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布

    6月23日,小米集团创始人兼ceo雷军在其个人社交媒体账号上正式公布,备受瞩目的小米首款suv车型——小米yu7,将于6月26日(本周四)晚上7点正式亮相。本次发布会不仅将推出小米yu7,还将同步发布小折叠屏手机小米flip 2、搭载玄戒o1旗舰芯片的小米平板7s pro,以及一款“面向未来时代”的…

    2026年10月20日 • 用户投稿
    200
  • 如何在VSCode中调试Node.js应用

    如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用

    首先配置launch.json文件,然后在VSCode中设置断点并启动调试,即可实现Node.js应用的断点调试、变量查看与控制台输出。 在VSCode中调试Node.js应用非常方便,只需简单配置即可实现断点调试、变量查看和控制台输出等功能。以下是具体操作步骤。 启用调试功能 VSCode内置了对…

    2026年10月20日 • 用户投稿
    000
  • 抖音网页版登录平台 抖音官网网页版使用说明

    抖音网页版登录平台 抖音官网网页版使用说明抖音网页版登录平台 抖音官网网页版使用说明抖音网页版登录平台 抖音官网网页版使用说明抖音网页版登录平台 抖音官网网页版使用说明

    本说明将引导您如何访问抖音官方网页版登录平台,并详细介绍其使用方法。通过电脑浏览器,您可以直接访问抖音平台,享受大屏带来的沉浸式观看体验。网页版主打无需安装、即开即用的核心优势,虽然功能上与手机app有一定差异,但足以满足日常的浏览和互动需求。 官方登录平台入口 为确保您的账户安全,请务必通过以下官…

    2026年10月20日 • 用户投稿
    200
  • Spring Boot JPA中利用数据引导机制按需创建数据库视图

    Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图

    在spring boot jpa应用中,当需要使用数据库视图但又不想手动维护sql创建语句时,传统的`commandlinerunner`方式可能因启动顺序导致问题。本文介绍一种利用数据引导(data bootstrap)机制的解决方案,通过在应用启动时动态创建视图或加载初始数据,并结合`@prof…

    2026年10月20日 • 用户投稿
    000
  • 部署VSCode区块链智能合约开发套件与以太坊测试环境

    部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境

    答案:搭建VSCode区块链开发环境需整合Solidity插件、Hardhat框架与本地节点。首先安装VSCode及Solidity、Prettier等插件,创建项目并初始化;通过npm安装Hardhat,配置hardhat.config.js设置Solidity版本和网络;使用npx hardha…

    2026年10月20日 • 用户投稿
    000
  • Java自定义注解参数化:以接口枚举作为灵活值源的策略

    Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略

    本文探讨了在java自定义注解中,如何优雅地将实现特定接口的枚举类型作为注解参数。针对注解参数不支持联合类型的限制,提出了一种通过引入中间值源接口 (`myinterfacevaluesource`) 的解决方案。该方法不仅解决了直接传递枚举类的问题,还提升了注解参数的灵活性和可扩展性,允许非枚举类…

    2026年10月20日 • 用户投稿
    200
  • 探索VSCode Angular工程化与模块化管理

    探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理

    答案:通过Angular CLI构建标准化项目结构,利用TypeScript模块机制与功能模块划分,结合懒加载优化性能,并借助VSCode插件提升开发效率,实现可维护可扩展的Angular应用。 在现代前端开发中,Angular 作为一个成熟的框架,强调工程化与模块化。结合 VSCode 这一高效编…

    2026年10月20日 • 用户投稿
    100
  • 奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek

    奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek

    奥特曼能不急吗? 被 DeepSeek 狂轰乱炸了一周后,终于在今天发布了新的模型 o3-mini。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 此次发布,o3-mini 包含 low、medium 和 high 三个版本。 OpenAI…

    2026年10月20日 • 用户投稿
    100
  • Java中从URL字符串提取服务器名称的教程

    Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程

    本教程将详细指导如何在java中使用`indexof`和`substring`方法,从给定的url字符串中准确提取服务器名称。文章将涵盖处理不同协议(如`http://`或`https://`)以及url末尾不含路径斜杠等多种情况,提供清晰的逻辑解析和实用的代码示例,帮助开发者构建健壮的url解析功…

    2026年10月20日 • 用户投稿
    300
  • 华为 WATCH GT 6 开启预售 多维情绪健康监测 1488 元起

    9 月 20 日,华为正式开启 watch gt 6 全款预售,提供 41mm 与 46mm 两种表径选择,配色涵盖流光紫、魅影黑、浮光白和马鞍棕,起售价为 1488 元。而定位更高的华为 watch gt 6 pro 目前仅推出 46mm 版本,拥有曜石黑、钛空银、琥珀棕三款配色,暂未公布售价,现…

    2026年10月20日
    700
  • 赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!

    赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 编辑丨& 人工神经网络(ANN)是大多数深度学习(DL)算法的核心,这些算法可以成功解决图像识别、自动驾驶和自然语言处理等复杂问题。然而,与能够高效解决类似问题的生物大脑不同,DL 算法…

    2026年10月20日 • 用户投稿
    200
  • QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接

    QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接

    qq邮箱作为一款由腾讯公司推出的经典且功能强大的电子邮件服务,凭借其多年的稳定运营和持续创新,已成为亿万用户处理个人事务和工作沟通的重要工具。它不仅仅是一个收发邮件的平台,更是一个集成了大容量存储、文件中转、日程管理和移动办公于一体的综合性通讯枢纽,以其卓越的稳定性和与qq、微信等社交生态的无缝衔接…

    2026年10月20日 • 用户投稿
    500
  • 《巫师4》首批官方壁纸发布 PC和手机端都有

    《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有

    近日,《巫师》官方账号发布了《巫师4》技术演示中的全新壁纸,首次展示了游戏中的新区域——科维尔。 与此同时,《巫师4》官方网站也公开了本作的首批详细信息: 开启巫师系列新篇章 《巫师4》是由 CD PROJEKT RED 打造的一款单人开放世界角色扮演游戏。作为系列新篇章的起点,玩家将首次以希里的身…

    2026年10月20日 • 用户投稿
    000
  • 华硕展示首批搭载英特尔Panther Lake的AI笔记本

    华硕展示首批搭载英特尔Panther Lake的AI笔记本华硕展示首批搭载英特尔Panther Lake的AI笔记本华硕展示首批搭载英特尔Panther Lake的AI笔记本华硕展示首批搭载英特尔Panther Lake的AI笔记本

    宏碁Swift 16 AI首发搭载英特尔Panther Lake处理器,该处理器基于18A制程,性能提升超10%,功耗降低40%,AI算力达180TOPS,支持Wi-Fi 7,预计2026年初上市。 目前,首批搭载英特尔Panther Lake处理器的AI笔记本由Acer率先展示,而非华硕。 Ace…

    2026年10月20日 • 用户投稿
    000
  • 从Java Optional String中高效提取指定分隔符前的首个单词

    从Java Optional String中高效提取指定分隔符前的首个单词从Java Optional String中高效提取指定分隔符前的首个单词从Java Optional String中高效提取指定分隔符前的首个单词从Java Optional String中高效提取指定分隔符前的首个单词

    本文探讨了如何从Java Optional中提取指定分隔符前的首个单词,例如从电子邮件地址中获取用户名。我们推荐使用String.replaceFirst()方法配合正则表达式,以简洁高效地实现此功能,避免了不必要的Stream操作。同时,文章强调了Java Optional的最佳实践,建议避免将其…

    2026年10月20日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信