首页 > 编程语言 >Java 编程中关于异常处理的 10 个最佳实践

Java 编程中关于异常处理的 10 个最佳实践

时间:2023-08-10 21:38:45浏览次数:42  
标签:10 Java 检查 代码 编程 实践 异常


异常处理在编写健壮的Java应用的过程中,扮演着一个重要的角色。它并不是应用的功能需求,且需要优雅的处理任何错误情况,例如资源不可用,错误的输入,null输入等等。Java提供几个异常处理功能,并通过try, catch 和  finally关键字内嵌在语言的本身。Java编程语言同样允许创建新的异常和使用  throw 和 throws 抛出该异常。在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践。这些 Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码。这还是一个提供给java程序员编写健壮代码的便利手册。

 

Java 编程中异常处理的最佳实践




这里是我收集的10个Java编程中进行异常处理的10最佳实践。在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能。在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常。

1)为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。

选择检查型还是非检查型异常,对于Java编程人员来说,总是让人感到困惑。检查型异常保证你对错误条件提供异常处理代码,这是一种从语言到强制你编写健壮的代码的一种方式,但同时会引入大量杂乱的代码并导致其不可读。当然,如果你有替代品和恢复策略的话,捕捉异常并做些什么看起来似乎也在理。在Java编程中选择检查型异常还是运行时异常,更多信息参考 checked vs unchecked exceptions


Java 编程中关于异常处理的 10 个最佳实践_java




等PM翻译于 3个月前

2人顶




 





2)在finally程序块中关闭或者释放资源

这在Java编程中,是一个广为人知的最佳实践,在处理网络和IO类的时候,相当于一个标准。在finally块中关闭资源, 在正常和异常执行的情况下,保证之前和稀缺资源的合理释放,这由y finally块保证。从Java7开始,该语言有了一项更有趣的功能:资源管理自动化或者ARM块能实现这一功能。尽管如此,我们仍然要记住在finally块中关闭资源,这是对于释放像FileDescriptors这类,应用在socket和文件编程的情况下的有限资源很重要的。

3)在堆栈跟踪中包含引起异常的原因

很多时候,当一个由另一个异常导致的异常被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常。日志记录和打印根异常就变得非常重要。Java异常类提供了 getCause()方法来检索导致异常的原因,这些(原因)可以对异常的根层次的原因提供更多的信息。该Java实践对在进行调试或排除故障大有帮助。时刻记住,如果你将一个异常包装成另一种异常时,构造一个新异常要传递源异常。


Java 编程中关于异常处理的 10 个最佳实践_java




等PM翻译于 3个月前

0人顶




 





4)始终提供关于异常的有意义的完整的信息

异常信息是最重要的地方,因为这是程序员首先看到的第一个地方,这里你能找到问题产生的根本原因。这里始终提供精确的真实的信息。例如,对比IllegalArgumentException 异常的两条异常信息:



消息 1: "Incorrect argument for method"



消息 2: "Illegal value for ${argument}: ${value}



第一条消息仅说明了参数是非法的或者不正确,但第二条消息包括了参数名和非法值,而这对于找到错误的原因是很重要的。在用Java编程中编写异常处理代码的时候,始终遵循该Java最佳实践。

5)避免过度使用检查型异常

检查型异常在强制执行方面有一定的优势,但同时它也破坏了代码,通过掩盖业务逻辑使代码可读性降低。只要你不过度使用检查型异常,你可以最大限度的减少这类情况,这样做的结果是你会得到更清洁的代码。你同样可以使用Java7的新功能,像one catch block for multiple exceptions 和 automatic resource management以移除重复项。


Java 编程中关于异常处理的 10 个最佳实践_java




等PM翻译于 3个月前

0人顶




 





6)将检查型异常转为运行时异常

这是在像Spring之类的多数框架中用来限制使用检查型异常的技术之一,大部分出自于JDBC的检查型异常,都被包装进DataAccessException中,而(DataAccessException)异常是一种非检查型异常。这是Java最佳实践带来的好处,特定的异常限制到特定的模块,像 SQLException 放到DAO层,将意思明确的运行时异常抛到客户层。

7)记住对性能而言,异常代价高昂

需要记住的一件事是异常代价高昂,同时让你的代码运行缓慢。假如你有方法从ResultSet(结果集)中进行读取,这时常会抛出SQLException异常而不会移到下一元素,这将会比不抛出异常的正常代码执行的慢的多。因此最大限度的减少不必要的异常捕捉和移动,那里没有什么固定的原因。不要仅仅是抛出和捕捉异常,如果你能使用boolean变量去表示执行结果,可能会得到更整洁,更高性能的解决方案。修正错误的根源,避免不必须要的异常捕捉。


Java 编程中关于异常处理的 10 个最佳实践_java




等PM翻译于 3个月前

0人顶




 




 




8)避免catch块为空

没有什么比空的catch块更糟糕的了,因为它不仅隐藏了错误和异常,同时可能导致你的对象处于不可使用或者脏的状态。空的catch块只能变得无意义,如果你非常肯定异常不会继续以任何方式影响对象状态,但在程序执行期间,用日志记录错误依然是最好的(方法)。对于在Java编程中编写异常处理代码,这不仅仅是一个Java最佳实践,而是一个最通用的实践。

9)使用标准异常

我们的第九条最佳实践建议使用标准和内置的Java异常。使用标准异常而不是每次创建我们自己的异常,对于维护性和一致性,不管是现在还是以后,都是最好的选择。重用标准异常使代码更具可读性,因为大部分Java开发人员对标准的像源自于JDK的RuntimeException 异常,IllegalStateException 异常,IllegalArgumentException 异常或者 NullPointerException异常,(开发者)他们能一眼就知道每种异常的目的,而不是在代码里查找或者在文档里查找用户定义的异常的目的。

10)记录任何方法抛出的异常

Java提供了throw和throws关键字来抛出异常,在javadoc中用@throw记录任何方法可能会抛出的异常。如果你编写API或者公共接口,这就变得非常重要。任何方法抛出的异常都有相应的文档记录,这样你就能下意识的提醒任何使用(该方法)的人。

这些就是所有在Java编程中在处理异常的时候需要遵循的最佳实践。让我们知道了什么是在Java编程中编写异常处理代码时需要遵循的实践。


标签:10,Java,检查,代码,编程,实践,异常
From: https://blog.51cto.com/u_6174294/7039861

相关文章

  • DWR、Java 和 Dojo 工具箱集成 Java 和 JavaScript
    2008年8月29日您能很快地说出多少Java™Web开发框架、库和工具箱?没错,数量太多,以至于很难弄清楚它们各自的功能以及哪个功能可以真正帮助您解决问题。但是,如果您从事的是Ajax开发,那么您必须要知道这个库:DirectWebRemoting(DWR)。它利用Java语言和JavaWeb技术大大......
  • Java系统中内存泄漏测试方法的研究
    摘要稳定性是衡量软件系统质量的重要指标,内存泄漏是破坏系统稳定性的重要因素。由于采用垃圾回收机制,Java语言的内存泄漏的模式与C++等语言相比有很大的不同。全文通过与C++中的内存泄漏问题进行对比,讲述了Java内存泄漏的基本原理,以及如何借助Optimizeitprofiler工具来测试内......
  • 2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区
    2023-08-10:景区里有m个项目,也就是项目数组为int[][]game,这是一个m*2的二维数组景区的第i个项目有如下两个参数:game[i]={Ki,Bi}Ki一定是负数,Bi一定是正数举个例子:Ki=-2,Bi=10如果只有1个人买票,单张门票的价格为:Ki*1+Bi=8所以这1个人游玩该项目要花8元如果有2......
  • 深入探讨 Java 类加载器
    入探讨Java类加载器成富,软件工程师,IBM中国软件开发中心简介:类加载器(classloader)是Java™中的一个很重要的概念。类加载器负责加载Java类的字节代码到Java虚拟机中。本文首先详细介绍了Java类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载......
  • java自定义注解
    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在java.lang.annotation包中。1、元注解元注解是指注解的注解。包括 @Retention@Target@Document@Inherite......
  • 2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区
    2023-08-10:景区里有m个项目,也就是项目数组为int[][]game,这是一个m*2的二维数组景区的第i个项目有如下两个参数:game[i]={Ki,Bi}Ki一定是负数,Bi一定是正数举个例子:Ki=-2,Bi=10如果只有1个人买票,单张门票的价格为:Ki*1+Bi=8所以这1个人游玩该项目要花8元......
  • java_转义字符
    转义符解释\t制表位\n换行\\一个\\"一个"\'一个'\r光标回到本行的行首packagebicly;publicclassBicycleDemo{publicstaticvoidmain(String[]args){System.out.print("AAA\tBBB\nCCC\\DDD\"EEE\n......
  • 在Java中操作Redis_Spring Data Redis使用方式_其他类型的数据操作
        ......
  • java高级之反射
    1.理解反射:【其就是在运行时,它是把类中成员抽取为其他类对象的过程】2.获取反射Class的三种方式:【获取之前首先要创建一个类对象,这里就叫做xw.Class】其一:通过Class.forName的方式获取:及Class<?>aClass=Class.forName("com.ssm.entity.fanshe.xw");其二:通过类名.cl......
  • 8.10
    今天考科目三一边过,拿捏,中间出了点插曲,从早上十点开始驾校说全邢台市都停考,科一科二科三都一样,一直到下午三点才开始考试,但是还是比昨天好多了。typedefstructceshi{charname[20];intdz;}cs;intmain(){intn,m;scanf("%d",&n);inti,j,k=0;......