面对Java出现异常,应该怎么做才是正确的?

java异常Exception,java出现异常的场景 目录 java异常Exception,java出现异常的场景 java内置的异常和Throwable核⼼⽅法介绍 java进阶基础之Try Catch异常捕获 Java异常进阶之Finally讲解和多重捕获 java异常处理之throws/throw关键词 java进阶基础之⾃定义异常 java异常Exception,java出现异常的场景 什么是错误 程序运⾏时发⽣的不被... 阅读详情

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

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

1 使用异常而不是返回码

我们先看如下代码例子

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public void demo01(Long userId){
    String userName = getUserName(userId);
    if (StringUtils.isNotEmpty(userName)) {
        //继续之后的逻辑
    } else {
        log.info("没有获取到用户名称");
    }
}

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

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

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public void demo02(Long userId){
    String userName = getUserName(userId);
    if (StringUtils.isNotEmpty(userName)) {
        //继续之后的逻辑
    } else {
        throw new BusinessException("没有获取到用户名称");
    }
}

2 使用不可控异常

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

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

<pre class="prettyprint hljs php" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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失败了,查看数据库和代码逻辑可以快速定位问题。若是有其他信息,一并传入会有更大的帮助。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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 的方法都要判断是否为空。

<pre class="prettyprint hljs php" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">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,这样调用的方法就不用都去判断是否为空了。 像这样:

<pre class="prettyprint hljs kotlin" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">private List<User> getManagers(Long userId) {
    List<User> users = getDataFromDB(userId);
    if (CollectionUtils.isEmpty(users)) {
        return Collections.emptyList();
    } else {
        return users;
    }
}
跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88 PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性 阅读详情

相关推荐

吐血总结《Mysql从入门到入魔》,图文并茂

文章目录1. 查询1.1 查询多列1.2 检索唯一值1.3 限制输出1.4 注释2. ORDER BY 排序2.1 单列排序3.2 多列排序3.3 指定排序方向4. WHERE 过滤数据4.1 WHERE 子句操作符4.2 范围值检查4.3 空值检查5. 高级数据过滤5.1 WHERE 组合过滤5.2 IN 操作符5.3 NOT 操作符6. 通配符过滤6.1 % 通配符6.2 _ 通配符7. 创建计算字段7.1 计算字段7.2 拼接字段7.3 执行算数计算8. 函数8.1 常用文本处理函数8.2 日期和时间

向日葵的专属太阳 3万+

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

本篇文章主要讲解**Java中的几种异常关键字和异常类**相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

小威的博客 1万+

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3942

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

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

微赚淘客开发者博客 1362

Qlib+backtrader:2014.1.1-2023.9.20最新回测结果,可以实盘吗?

今年以来,在研究了qlib和backtrader的基础上,把二者结合起来进行了一个策略研究。简单说就是用qlib在200只股票的股票池中进行滚动训练与预测(walk forward),总体数据范围是2005到2023年,以20日间隔滚动训练和预测,最终得到2014.1.1-2023.9.20共10年测试期的收益率预测结果。将预测结果代入backtrader进行回测,得到如下回测结果。

qtbgo的博客 1783

西门子S7-1200与汇川SV660P伺服速度模式实战:从接线到编程全流程

本文详细解析了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的集成实战。内容涵盖从硬件接线、伺服参数关键设置(如电子齿轮比)、博图软件组态到PLC编程的全流程,并提供了故障排查与性能优化指南,帮助工程师快速实现精准、稳定的运动控制。

weixin_29248313的博客 487

Java如何优雅的进行判空

实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。针对异常的处理我们在上一篇有提及:先来看一下实际项目中一些判空方式通常我们判断一个对象是否为Null,可以使用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或者直接 null!= obj每种方法的存在必然有适用的场景,有些情况下这种链式编程,虽然代码优雅了。但是,逻辑性没那么明显,可读性有所降低,大家项目中看情况酌情使用。

Java技术攻略的博客 3660

【电子通识】TINA-TI怎么使用受控源向导创建受控源

TINA-TI怎么使用受控源向导创建受控源

一点硬件 358

java异常2 API实战

原文链接:https://mp.weixin.qq.com/s/j8vc1g51geIvGvgEvCvi-w 如何选择异常类型 异常的类别 正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.lang.Exception(后文省略为Exception)和java.lang.Error(后文...

wang123459的博客 885

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 521

【JAVA-Day69】抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题

抛出异常不仅是一种良好的编程习惯,更是保障程序稳定性和用户体验的必备手段。通过细致的讨论,我们将揭示异常抛出的内在价值,并学会如何在代码中巧妙地抛出异常。抛出异常是指在程序执行过程中,发生了一些错误或异常情况,程序无法继续正常执行时,通过抛出异常来通知调用者或上层代码发生了问题。异常是一种用于处理错误情况的机制,它可以中断正常的程序流程,并跳转到异常处理的代码块。在编程中,抛出异常通常是通过使用特定的关键字或语句来实现的。在大多数编程语言中,这些关键字通常是throwraise或类似的关键字。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

【工具插件类教学】Unity翻书效果插件Book-Page Curl Pro教程

特征: • 从左到右和从右到左翻页 • 与画布缩放器 配合使用 • 可配置的自动翻转脚本 • 支持向页面 添加 UI 元素 • 支持透明页面 • 适用于“世界空间”画布

纯技术流日常开发商业开发记录总结等 3673

Java中数组出现异常的处理方法

package cn.tedu.day03; /** - - 数组越界异常 - 访问了数组中不存在的索引 - ArrayIndexOutOfBoundsException - 空指针异常 - NullPointerException - 数组的引用没有指向对象,但是却在操作对象中的元素 - - - @author Administrator * */ public class ...

Nefertair的博客 2286

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

线程中出现异常的处理

在紧密交织的多线程环境中,异常处理是一个经常被讨论的容易被忽视的关键部分。这并不奇怪,因为在编写并发代码时,管理和理解可能出现的各种异常条件可能是一个挑战。在单线程环境中,发生异常时,异常信息会立刻被捕获并处理,然而,在多线程环境中的异常处理复杂性要高很多。未被正确处理的异常可能导致全局性影响,甚至系统崩溃。这给程序稳定性带来威胁,且可能会导致无法预料的行为。因此,对于编写健壮且可靠的并发代码来说,理解并且正确处理线程中的异常是至关重要的。本文旨在深入探讨Java中线程级别的异常处理。

m0_62943934的博客 2592

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java 线程出现异常_Java多线程问题--线程运行时出现异常的解决办法

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!代码地址:https://github.com/xianzhixianzhixian/thread.git线程运行时出现问题的几种解决办法1、为特定线程指定一个异常处理器thread.setUncaughtException(new UncaughtExceptionHandler(){@Overridepublic void unca...

weixin_34844709的博客 672

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 程序中出现异常而不去catch是否一定终止?

java 程序中出现异常而不去catch,出现异常之后的代码是运行不到的,导致程序终止,具体解释如下: RuntimeException也是一样的.RuntimeException是一种可以编绎通过的异常,但运行还是不能通过的,如果不想程序终止,也要去try catch它. 除0异常就是一种RuntimeException,你可以在自己机子上试下. 而非RuntimeException的Exception如果不try catch它,则必须要throws出去.否则编绎都无法通过.当然如果你仅仅是throws出

weixin_42408447的博客 4486

浅谈Java如何正确关闭流

1.在try中关流,而没在finally中关流 try { OutputStream out = new FileOutputStream(""); // ...操作流代码 out.close(); } catch (Exception e) { e.printStackTrace(); } 正确写法: OutputStream out = null; try { out = new FileOutputStream(""); // ...操作流代码 } catch (Exception e)

学习 记录 总结 分享 9732

CompletableFuture allOf 的时候如果出现异常会怎么样

在日常开发中如果使用 CompletableFuture 的时候,如果出现异常,会怎么样呢,会只停止这个线程还是全部停止?会主动抛出异常吗,今天我通过一下案例来以结果来分析。

xl-9527 的博客 980

java中正确关闭流

在操作java流对象后要将流关闭释放此流有关的所有系统资源,不然OutputStream会大量占用系统内存,可能会导致内存溢出。 因为OutputStream的各种write()方法可能会抛出IO异常,而不能将流关闭,大致有以下三种情况不一定能将流真正关闭: 1.在try中关流,而没在finally中关流 try{ File file = new File("D:\\file.txt"); OutputStream out = new FileOutputStream(file);

csdjia11的博客 3664

浅谈为什么java命令运行class文件出现异常

摘要  相信每一个初学者学习Java时,刚开始练习编程Java都会写一个HelloWord程序,然后会按照书本上那样用命令行去编译,解释Java程序,或许当时你执行成功了;可是当你进一步学习更多的知识的时候,学到了用包命名空间来解决类名冲突后,你写的程序会更加完善健壮,而你此时还是利用初学时的方法去编译解释这个程序错误时,可能会遇到这个错误:Exception in thread “main” ja

dawn_after_dark的博客 1734

JAVA中出现异常、抛出异常后续代码是否执行

出现异常时,try-catch对代码执行的影响、循环时出现异常后续代码是否执行、调用的方法内部出现异常

m0_68201836的博客 3488

Java日志出现异常,但没有完整的堆栈信息

Java日志出现异常,但没有完整的堆栈信息

qq_38472451的博客 347

JAVA 线程出现异常

 如果你在运行线程用wait()方法时出现这个异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException 很有可能是你没有按这个格式写:synchronized (notify2) { notify2.notify();}synchronized (notify2) { t

afternoone的专栏 1077

java经常会出现异常的是,“Java异常Exception”总结

1. 异常(Exception)。 2.Java中的异常分为两大类: a) Checked exception (非 Runtime Exception) 非运行时异常 b) Unchecked exception(Runtime Exception) 运行时异常 3. Java中所有的异常类都会直接或间接地继承自Exception。 4. RuntimeException类也是直接继承自Ex...

weixin_34457571的博客 384

java代码块如果出现异常_Java 异常处理

Java 异常处理异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。异常发生的原因有很多,通常包含以下几大类:用户输...

weixin_36414864的博客 400
上一篇: Java SE 13 新增特性
下一篇: 怎样去优化JAVA中的实现代码
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值