Java中如何优雅的处理异常

Java 进阶之路:异常处理的内在原理及优雅的处理方式 永远不要期待程序在完全理想的状态下运行,异常往往不期而遇,如果没有完善的异常处理机制,后果可能是灾难性的。对于 Java 工程师而言,合理地处理异常是一种基本而重要的能力,然而,在近来的面试中,笔者发现很多应聘者对异常处理的内在原理几无了解,现场手写的异常处理代码也极为“原始”。 鉴于此,笔者将通过本场 Chat 为读者呈现 Java 异常处理的内在原理、处理原则及优雅的处理方式。主要内容如下: Java 异常的层次结构和处理机制 Java 异常表与异常处理的内在原理 .Java 异常处理的基本原则 优雅 阅读详情

对于后端程序员来说,写Java程序的时候,处理异常是必须要做的事。错误处理固然重要,但是若是被错误处理占据了大部分逻辑,那么就大错特错了。

最近对这一点略有研究,稍微提一些优雅的处理异常的技巧和思路。

1 使用异常而不是返回码

我们先看如下代码例子

public void demo01(Long userId){
    String userName = getUserName(userId);
    if (StringUtils.isNotEmpty(userName)) {
        //继续之后的逻辑
    } else {
        log.info("没有获取到用户名称");
    }
}
复制代码

若是执行这段代码的时候,userName为空,会影响接下来的逻辑。可是若是只是输出一段日志,刚写代码的时候,比较熟悉,检查起来容易,但是时间久了或者后边的同学接手代码的时候就有点烦脑了。

最好是直接抛出异常,既然已经影响到接下来的逻辑了,那就抛出异常,阻断进程。如下所示:

public void demo02(Long userId){
    String userName = getUserName(userId);
    if (StringUtils.isNotEmpty(userName)) {
        //继续之后的逻辑
    } else {
        throw new BusinessException("没有获取到用户名称");
    }
}
复制代码

2 使用不可控异常

若是使用可控异常,那么在多层封装的时候,需要在每个catch块中声明这个异常,若是在最底层的方法中新增了一个可控制异常,那么每个调用此方法的函数都要新增一个throw语句。

就像如下代码所示,当getManager新增一个可控异常,那么demo03相对应也要新增一个catch块。调用demo03的方法也要新增。以此类推,那么就是从最底层到最高层的一个修改链。

public void demo03(Long userId) throws Exception {
    try {
        String userName = getManager(userId);
        //继续之后的逻辑
    } catch (BusinessException e) {
        throw e;
    } catch (Exception e) {
        throw new Exception(e);
    }
}

private String getManager(Long userId) throws Exception {
    try {
        //获取当前用户的manager
    } catch (BusinessException e) {
        throw new BusinessException("获取manager失败");
    } catch (Exception e) {
        throw new Exception(e);
    }
    return "manager";
}
复制代码

3 给异常提供更多的信息

当抛出异常的时候,提供更多的信息,有助于找到问题并快速解决。能从错误日志中获取到足够多的信息,来准确分析发生错误的原因,是一件多么美妙的事情。

如下例子,通过错误信息可以看到是获取谁的manager失败了,查看数据库和代码逻辑可以快速定位问题。若是有其他信息,一并传入会有更大的帮助。

public void demo04(Long userId) throws Exception {
    try {
        String userName = getManager(userId);
        //继续之后的逻辑
    } catch (Exception e) {
        throw new BusinessException("获取当前用户的manager失败,当前用户id为:"+userId);
    }
}
复制代码

4 别在方法中返回null值

这一点感同身受,在代码中处理了大量的空判断,调用前人写的代码的时候,一不小心就空指针了,自己新写方法又重复了逻辑。

在如下例子中,getManagers直接返回了从数据库获取到的数据,若是没有数据返回,那么List<User>对象就为null。这样每个调用getManagers的方法都要判断是否为空。

public void demo05(Long userId) throws Exception {
    List<User> userList = getManagers(userId);
    if (!CollectionUtils.isEmpty(userList)) {
        for (User user : userList) {
            //继续之后的逻辑
        }
    }
}

private List<User> getManagers(Long userId) {
    List<User> users = getDataFromDB(userId);
    return users;
}
复制代码

当getDataFromDB的返回为空的时候,我们直接返回一个空list,这样调用的方法就不用都去判断是否为空了。 像这样:

private List<User> getManagers(Long userId) {
    List<User> users = getDataFromDB(userId);
    if (CollectionUtils.isEmpty(users)) {
        return Collections.emptyList();
    } else {
        return users;
    }
}
复制代码

当然还有更多的更优雅的处理异常的方法,各位可以可以在评论区留言

Java:如何优雅地处理异常 在 Java 中,异常处理是一种控制程序流的方法,它允许你捕捉并响应程序执行过程中可能出现的问题。Java 的异常处理机制主要包括以下几个关键字:try、catch、finally、throw 和 throws。在某些情况下,你可能需要创建自己的异常类来更准确地描述错误条件。示例代码try {throw new InvalidAgeException("年龄不能为负数");System.out.println("年龄验证通过");哇塞! 阅读详情

相关推荐

ADP在线自适应动态规划之持续激励条件

在线自适应动态规划之持续激励条件 在在线自适应动态规划算法中,需要通过满足持续激励条件(Persistent Excitation Condition)保证critic网络权值的收敛性,一般的做法都是在算法初期在输入端引入探测噪声(Probing Noises)来保证数据的丰富性,但是由于在输入端引入噪声会给系统带来一些不好的影响,甚至可能破坏系统的稳定性。因此,出现了一些其他的方法来避免引入探测噪声,受阅读所限,我目前了解两种: Concurrent Learning(CL) Experience Re

qq_43435956的博客 6161

如何优雅的处理Java异常?这9个最jia实践或许对你有帮助

Java中应该如何处理异常,这个话题看似简单,不就是try...catch嘛,但是往往BUG更容易出现在一些简单地、我们更容易忽略的地方。 大多数成熟的开发团队对于如何进行异常处理都有一套规范和最佳实践。 本期内容我整理了一些在我的团队正在使用的9个最佳实践,希望能让你对异常处理有所帮助。 1、使用finally或try...with...resource关闭资源 如果我们在try代码块中需要使用到一些资源,比如InputStream,在使用完之后我们需要将资源关闭。 这是一个错误示例 pub

欢迎来到我的博客 935

基于Meteoinfo与TrajStat的后向轨迹聚类分析实战:从数据准备到可视化制图

本文详细介绍了基于Meteoinfo与TrajStat进行后向轨迹聚类分析的完整实战流程。从Java环境配置、Meteoinfo软件与TrajStat插件安装,到精准获取NOAA气象数据、设置参数进行批量轨迹计算,再到利用聚类分析提炼主要气流路径,并最终完成专业地图可视化与制图。文章旨在帮助环境与气象研究者快速掌握从数据准备到成果输出的全链路操作。

p4q5r6s7t的博客 804

如何使用Java异常处理来优雅地处理各种异常情况?

异常处理是Java编程中非常重要的一部分。通过使用Java异常处理机制,我们可以更好地调试和排除代码中的错误,提高代码的可读性、可维护性和稳定性。在编写Java代码时,我们应该尽可能地遵循最佳实践,例如使用多个catch块处理不同类型的异常、始终使用finally块释放资源、尽量避免使用throws关键字等。

网络技术联盟站 834

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘

本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。

2403_85993278的博客 1512

如何在Java中优雅地处理异常?

通过本文,我们深入探讨了在Java中优雅地处理异常的多种技巧和最佳实践。从基本的try-catch语句到finally块的资源管理,再到自定义异常和异常链传递,这些技术可以帮助开发者编写出更加健壮和可靠的Java程序。合理地处理异常不仅可以提升代码的质量和可维护性,还能有效地减少程序运行时的意外崩溃,保证系统的稳定性。

微赚淘客开发者博客 1362

基于STM32设计的水下水质检测装置(微信小程序)(205)

本项目设计了一款基于STM32微控制器为核心的水下水质检测设备,该设备具有高度集成化、智能化的特点,能够实时监测水深、温度、浊度及溶解性总固体(TDS)等关键水质参数,并通过4G网络将数据上传至腾讯云IOT物联网平台,实现远程监控和数据分析。同时,为了便于操作和移动观测,还配套开发了微信小程序,用户可通过微信小程序实时查看并控制设备的各项功能,如调整下潜深度等。

1250

如何优雅的处理异常

Java 语言按照错误严重性,从 throwale 根类衍生出 Error 和 Exception 两大派系。程序在执行过程中所遇到的硬件或操作系统的错误。错误对程序而言是致命的,将导致程序无法运行。常见的错误有内存溢出,jvm 虚拟机自身的非正常运行,calss 文件没有主方法。程序本生是不能处理错误的,只能依靠外界干预。Error 是系统内部的错误,由 jvm 抛出,交给系统来处理。程序正常运行中,可以预料的意外情况。比如数据库连接中断,空指针,数组下标越界。

weixin_39158966的博客 605

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 638

【uniapp踩坑记】App Store上传失败:Invalid Swift Support错误怎么解决?

作为一个前端出身的开发者,用 uniapp 开发原生 App 已经够挑战了,打包 iOS 上传 App Store 更是处处暗雷。这次的坑虽然小,但确实容易忽略。如果你也遇到了类似的报错,希望这篇文章能帮你少踩一次坑!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1143

java如何优雅的处理异常

Java中优雅地处理异常通常意味着遵循一些最佳实践,使得代码易于理解、维护,并且能够妥善地处理错误情况

m0_49464000的博客 613

Python 陌生代码库阅读之道:从零起步到一周掌控 5 万行老项目的实战策略

文中特别强调"自顶向下+画图+注释"的基础阅读心法,并提供了具体的代码示例和命令行技巧。对于大型项目,建议先建立核心流程的骨架认知,再逐步填充细节,同时注重文档化和测试覆盖率的提升。 掌握这套方法后,开发者可以将陌生代码库的阅读效率提升3倍以上,在一周内建立起对5万行级别项目的整体掌控力。

铭渊老黄 506

如何优雅地处理Java异常?

通过本文,我们深入探讨了如何在Java中优雅地处理异常。从基础的异常处理开始,到最佳实践的详细讨论,希望读者能够掌握异常处理的核心概念和实际应用技巧。在日常开发中,合理、精确地处理异常不仅能提升代码的可靠性,还能有效地改善系统的稳定性和可维护性。微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

聚娃科技开发者博客 402

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何优雅地处理 Java 异常

点击上方"Java学习之道",选择"关注"公众号每天早晨,干货准时奉上!本文作者:lrwinx 链接:https://lrwinx.github.io...

Java学习之道 2329

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java中异常的优雅处理方式

为了更好地区分不同的异常情况,可以定义自己的异常类,继承自Exception或RuntimeException。// 自定义异常类// 使用自定义异常try {// 可能抛出CustomException的代码// 处理CustomExceptionJava中异常的优雅处理是编写高质量、可维护代码的重要方面。通过使用try-with-resources、自定义异常类、异常链与传递、日志记录等方式,可以更好地处理各种异常情况。

EverythingAtOnce的博客 759

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何优雅地处理 Java 异常?实用策略全解析

在 Java 开发中,异常处理是一项非常重要的技能。优雅地处理异常,不仅能提高代码的健壮性和可读性,还能减少不必要的性能开销。本文将从常见的异常处理方式、最佳实践,以及避免常见错误的策略,全方位解析如何优雅地处理 Java 异常。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1108

java优雅的处理程序中的异常

java优雅的处理程序中的异常 一、自定义异常类 (1)继承 Exception 或 RuntimeException (2)定义构造方法 /** * @author lqh * @date 2020/9/22 * 业务逻辑异常 */ public class ServiceException extends RuntimeException{ private String code; private String msg; public ServiceException

qq_38939215的博客 1646

如何在Java中优雅地处理异常

在软件开发过程中,异常处理是一个至关重要的环节。良好的异常处理机制不仅能提升程序的健壮性,还能极大地改善用户体验。对于Java开发者来说,掌握如何有效地处理异常是非常必要的。本文将探讨几种在Java中优雅地处理异常的方法。使用try-with-resources语句 从Java 7开始,引入了try-with-resour...

cnzzs的博客 369

java优雅的处理异常_优雅地在Java 8中处理异常的方法详解

优雅地在Java 8中处理异常的方法详解发布时间:2020-09-20 15:50:50来源:脚本之家阅读:99作者:_pangzi前言Java 8 引入的流 (Stream) API 和 lambda 表达式为我们打开了新世界的大门,自此之后我们也可以在 Java 中进行函数式编程了。然而,在实际工作中,许多小伙伴并不知道如何正确的在 lambda 中处理异常,今天就来给大家讲解一下。小编给大家...

weixin_39964978的博客 196

java优雅的处理异常_如何优雅的处理java异常

原标题:如何优雅的处理java异常Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。异常之所以是一种强大的调试手段,在于其回答了以下三个问题:1、什么出了错?2、在哪出的错?3、为什么出错?在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你...

weixin_39924198的博客 267

Java异常处理的艺术从CheckedException到优雅的容错设计

Checked Exception要求程序员必须在编译时进行处理,否则代码无法通过编译,这体现了Java“防患于未然”的设计哲学,强制开发者关注那些可预见的、可恢复的异常情况,例如文件不存在(FileNotFoundException)或网络连接中断(IOException)。其次,避免在循环内部进行异常捕获,因为这会影响性能。最后,也是最重要的一点,区分业务异常和系统异常,业务异常(如“用户余额不足”)通常需要明确提示用户,而系统异常(如“数据库连接失败”)则应记录日志并可能触发告警,由运维人员处理。

currypop17的博客 941
上一篇: 再见 Shiro 权限认证我选择 Sa-Token:简单、优雅
下一篇: RocketMQ的push消费方式实现的简直不要太聪明
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值