Java异常处理最佳实践及陷阱防范 客官°小女子只卖身不卖艺 2022-01-20 05:53 218阅读 0赞 #### 前言 #### 不管在我们的工作还是生活中,总会出现各种“错误”,各种突发的“异常”。无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会导致其他新的问题出现。所以我们要时刻注意这些陷阱以及需要一套“最佳实践”来建立起一个完善的异常处理机制。 #### 正文 #### ##### 异常分类 ##### 首先,这里我画了一个异常分类的结构图。 在JDK中,Throwable是所有异常的父类,其下分为”Error“和”Exception“。Error意味着出现了不可控的严重错误,例如OutOfMemoryError。Exception则细分为两类,受检异常(check)需要我们手动try/catch或者在方法定义中throws,编译器在编译的时候会检查其合法性。非受检异常(uncheck)则不需要我们提前处理。这些简单的概念对于开发人员来说都是必须掌握的,这里就展示个图例,不做详细的描述了,我们的”正餐“还在后面。 ##### 重新认识try/catch/finally ##### 说到异常处理,这里就不得不提try/catch/finally。try不可以单独存在,要么搭配catch,要么搭配finally,或者三者并存。 1、try代码块:监视代码块的执行,发现对应的的异常则跳转至catch,若无catch则直接到finally块。 2、catch代码块:发生对应的异常会执行里面的代码,要么处理,要么向上抛出。 3、finally代码块:不管是否有异常,都必执行,一般用来清理资源,释放连接等。然而有以下几种情况不会执行到这里的代码。 * 代码执行流程未进入try代码块。 * 代码在try代码块中发生死循环、死锁等状态。 * 在try代码块中执行了System.exit()操作。 ##### try/catch/finally陷阱 ##### 下面介绍两个我们在使用tcf的时候可能会遇到的陷阱。 代码1 public class TCFDemo { public static void main(String[] args) { //11 System.out.println(returnVal()); } static int returnVal(){ int a = 1; int b = 10; try{ return ++a; }finally { return ++b; } } } 复制代码 陷阱1:在finally中添加return语句,这样会覆盖掉try代码return的值,假如业务逻辑比较复杂,这里是很容易掉坑的,不利于排查错误。 代码2 public class TCFDemo { public static void main(String[] args) { Lock lock = new ReentrantLock(); try{ //有可能加锁失败 lock.lock(); //dost }finally { lock.unlock(); } } } 复制代码 陷阱2:由于lock方法在加锁的时候有可能会抛出Uncheck异常,如果在try代码块中,必然会执行unlock方法,此时由于并没有加锁成功,所以会抛出IllegalMonitorStateException,这样一来后者的异常就覆盖掉了前者加锁失败的异常信息,所以我们应该把加锁的方法挪至try代码块外面。 ##### 最佳实践 ##### 好了,前面简单介绍了异常的分类以及try/catch/finally的注意事项,现在可以总结一下我们在异常处理的时候有哪些”最佳实践“了。 1. 当需要向上抛出异常的时候,需根据当前业务场景定义具有业务含义的异常,优先使用行业内定义的异常或者团队内部定义好的。例如在使用dubbo进行远程服务调用超时的时候会抛出DubboTimeoutException,而不是直接把RuntimeException抛出。 2. 请勿在finally代码块中使用return语句,避免返回值的判断变得复杂。 3. 捕获异常具体的子类,而不是Exception,更不是throwable。这样会捕获所有的错误,包括JVM抛出的无法处理的严重错误。 4. 切记更别忽视任何一个异常(catch住了不做任何处理),即使现在能确保不影响逻辑的正常运行,但是对于将来谁都无法保证代码会如何改动,别给自己挖坑。 5. 不要使用异常当作控制流程来使用,这是一个很奇葩也很影响性能的做法。 6. 清理资源,释放连接等操作一定要放在finally代码块中,防止内存泄漏,如果finally块处理的逻辑比较多且模块化,我们可以封装成工具方法调用,代码会比较简洁。 #### 结尾 #### 小小的异常,有大大的学问,你觉得呢? 公众号《深夜里的程序猿》 - 分享最干的干货
相关 Java异常处理最佳实践:实例解析及注意事项 Java异常处理是编程中不可或缺的一部分,它可以提高代码的健壮性和可读性。以下是一些Java异常处理的最佳实践: 1. **异常声明**:在可能出现异常的地方使用`try`块 约定不等于承诺〃/ 2024年09月19日 13:33/ 0 赞/ 2 阅读
相关 Java异常处理最佳实践实例 在Java编程中,异常处理是确保程序稳定运行的重要机制。以下是一个Java异常处理的最佳实践实例: ```java public class BankAccount { 迈不过友情╰/ 2024年09月18日 12:51/ 0 赞/ 7 阅读
相关 Java异常处理的最佳实践 在Java中,异常处理是保证程序健壮性的重要手段。以下是一些关于Java异常处理的最佳实践: 1. **使用try-catch-finally**:当可能产生异常的代码块存在 「爱情、让人受尽委屈。」/ 2024年09月12日 19:36/ 0 赞/ 29 阅读
相关 异常处理的最佳实践:Java异常处理案例对比 在Java编程中,异常处理是一种机制,用于在程序运行过程中遇到问题时进行处理。以下是一些关于异常处理的最佳实践以及实际案例的对比: 1. **声明并捕获异常**: - 柔情只为你懂/ 2024年09月10日 10:36/ 0 赞/ 35 阅读
相关 Java异常处理的最佳实践 在Java中,良好的异常处理实践有助于程序的稳定性和可读性。以下是一些最佳实践: 1. **使用try-catch-finally结构**: - 将可能抛出异常的代码放 你的名字/ 2024年09月05日 20:00/ 0 赞/ 38 阅读
相关 java异常最佳处理_Java异常处理的最佳实践 本文是关于 Exception 处理的一篇不错的文章,从 Java Exception 的概念介绍起,依次讲解了 Exception 的类型(Checked/Unchecked 雨点打透心脏的1/2处/ 2022年11月08日 15:27/ 0 赞/ 176 阅读
相关 Java 异常处理最佳实践 1. 在Finally语句块中释放资源或者使用Try-With-Resource语句 比如,在Try语句中使用InputStream输入流,并且试图在Try语句块中关闭资 ╰半夏微凉°/ 2022年04月18日 06:47/ 0 赞/ 275 阅读
相关 Java异常处理最佳实践及陷阱防范 前言 不管在我们的工作还是生活中,总会出现各种“错误”,各种突发的“异常”。无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会 客官°小女子只卖身不卖艺/ 2022年01月20日 05:53/ 0 赞/ 219 阅读
相关 Java异常处理最佳实践 1. 在 finally 块中清理资源或者使用 try-with-resource 语句 ### 当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错... 灰太狼/ 2020年06月18日 09:09/ 0 赞/ 854 阅读
还没有评论,来说两句吧...