黑马程序员技术交流社区

标题: Java常用异常处理方法 [打印本页]

作者: 庭院深深深几许    时间: 2019-4-28 16:24
标题: Java常用异常处理方法
  很多Java工程师在开发过程中都对受检异常各有看法,应Java语言的要求此类异常是一定要处理的。这里搜集了N个Java常用异常处理方法实践,当然,我们应该少用受检异常,但也要学会区别使用受检和非受检异常。


  1.可恢复错误使用受检异常,编程错误使用非受检异常
  受检与非受检异常对Java工程师来说是很难选择的。从Java语言来说,它会强制你编写健壮代码,但同时也引入大量杂乱的代码并导致其可读性变差。当然,如果你有可替代方式或恢复策略的话,捕获异常并做处理看起来似乎也合情合理。在Java编程中选择受检异常还是运行时异常的更多信息,请参考checkedvsuncheckedexceptions。
  2.程序块finally当中,关闭或者释放资源
  在处理网络和IO操作时这是大家都知道的事实标准。在程序块finally中关闭资源能保证无论是处于正常还是异常执行的情况下,资源文件都能被合理释放,这由finally语句块保证。从Java7开始,新增加了一项更有趣的功能:自动资源管理,或者称之为ARM块。尽管如此,我们仍然要记住在finally块中关闭资源,这对于释放像FileDescriptors这类资源至关重要,因为它在socket和文件操作中都会被用到。
  3.在堆栈信息中包含引起异常的原因
  对于记录和打印根异常来说,Java库和开源代码会将两种异常包发生变化,这样就会变得非常重要。Java异常类提供了getCause()方法来获取导致异常的原因,这可以提供更多有关异常发生的根本原因的信息。这条实践对调试或排除故障大有帮助。在把一个异常包装成另一种异常时,记住需要把源异常传递给新异常的构造器。
  4.不断提供异常完整、有意义的信息
  Java程序员最能找到问题产生原因的地方就是异常信息中。所以应始终提供精确的真实的信息。例如,对比下面两条IllegalArgumentException的异常信息:
  message1:“Incorrectargumentformethod”message2:“Illegalvaluefor${argument}:${value}
  第一条消息仅说明了参数是非法的或不正确的,但第二条消息包括了参数名和非法值,这对找到错误原因很重要。在编写异常处理代码的时候,应当始终遵循该Java最佳实践。
  5.避免过度使用受检异常
  受检异常的强制性在某种程度上具有一定的优势,但同时它也使得代码可读性变差,混淆了正常的业务逻辑代码。你可以通过适度使用受检异常来最大限度地减少这类情况的发生,这样可以得到更简洁的代码。你同样可以使用Java7的新功能,比如在一个catch语句中捕获多个异常,以及自动管理资源,以此来移除一些冗余的代码。
  6.将受检异常转为运行时异常
  这是在诸如Spring之类的框架中用来减少使用受检异常的方式之一,大部分JDBC的受检异常都被包装进DataAccessException中,DataAccessException异常是一种非受检异常。这个最佳实践带来的好处是可以将特定的异常限制到特定的模块中,比如把SQLException抛到DAO层,把有意义的运行时异常抛到客户端层。
  7.记住异常的性能代价高昂
  需要记住的一件事是异常代价高昂,同时让代码运行缓慢。假如你有一个方法从ResultSet中进行读取,它经常会抛出SQLException而不是将cursor移到下一元素,这将会比不抛出异常的正常代码执行的慢的多。因此最大限度的减少不必要的异常捕捉,去修复真正的根本问题。不要仅仅是抛出和捕捉异常,如果你能使用boolean变量去表示执行结果,可能会得到更整洁、更高性能的解决方案。修正错误的根源,避免不必要的异常捕捉。
  8.避免空的catch块
  没有什么比空的catch块更糟糕的了,因为它不仅隐藏了错误和异常,同时可能导致你的对象处于不可用状态或者脏状态。空的catch块没有意义,除非你非常肯定异常不会以任何方式影响对象的状态,但在程序执行期间,用日志记录错误依然是最好的方法。这在Java异常处理中不仅仅是一个最佳实践,而且是一个最通用的实践。
  9.使用标准和内置的Java异常
  对于目前和后期代码的维护,切记用标准异常才是最佳方式。重用标准异常使代码可读性更好,因为大部分Java开发人员对标准的异常更加熟悉,比如JDK中的RuntimeException,IllegalStateException,IllegalArgumentException,NullPointerException,他们能立马知道每种异常的目的,而不是在代码或文档里查找用户自定义异常的目的。
  10.为方法抛出的异常编写文档
  Java提供了throw和throws关键字来抛出异常,在javadoc中可以用@throw为任何可能被抛出的异常编写文档。如果你编写API或者公共接口,这就变得非常重要。当任何方法抛出的异常都有相应的文档记录时,就能潜在的提醒任何调用该方法的开发者。



       传智播客精益求精的教学品质,也赢得了学员口口相传,这也使得传智播客稳居国内IT培训的领先地位。
  java培训
  传智播客的java培训课程已经有十三年的历史。教育质量始终领先同行业。
  传智Java培训拥有6大课程优势:(http://www.itcast.cn/javaee/
  ①独有的一站式IT职业教育体系,让学员通过6个月的线下学习实现高起点就业, 12个月的线上在职进阶课实现升职加薪,大幅提升学员的职场晋升速度。
  ②60+套技术解决方案,覆盖职场常见开发问题,让学员就业后快速上手开发难题,轻松成为核心员工。
  ③超大项目库,覆盖7大就业主流热门行业,让学员边学习边积累项目开发经验。
  ④超千人投入的3大课程研发库,每年耗资千万打造领先行业的优质课程。
  ⑤传智&华为课程共建,持续为课程输出前沿技术。
  ⑥120+超强师资团队,多为总监、架构师出身,除了专业技能,还为你规划适合你的职业发展路线。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2