【转】Java中关于异常处理的十个最佳实践

原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm

导读异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用
throw 和 throws关键字抛出它们。

异常处理是书写强健Java应用的一个重要部分,它是关乎每个应用的一个非功能性需求,是为了优雅的处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch和
finally 关键字的形式内建于语言自身之中。Java编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们。

事实上,异常处理不仅仅是知道语法,书写一个强健的代码更多的是一门艺术而不仅仅是一门科学,这里我们将讨论一些关于异常处理的Java最佳实践。这些 Java
最佳实践甚至被标准JDK库,以及一些开源代码所追随,也成为了Java程序员书写强健代码的手册。

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

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

  1.为可恢复的错误使用checked exception,为编程错误使用unchecked
exception

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

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

  这在Java编程中,是一个广为人知的最佳实践,在处理网络和IO类的时候,相当于一个标准:在finally块中关闭资源。

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

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

  很多时候,当一个由另一个异常导致的异常被抛出的时候,Java库和开放源代码会将一种异常包装成另一种异常,日志记录和打印根异常就变得非常重要。Java异常类提供了
getCause()方法来检索导致异常的原因,这些(原因)可以对异常的根层次的原因提供更多的信息。

  该Java实践对在进行调试或排除故障大有帮助,时刻记住,如果你将一个异常包装成另一种异常时,构造一个新异常一定要传递源异常。

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

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

  消息 1: "Incorrect argument for method"

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

  第一条消息仅说明了参数是非法的或者不正确,但第二条消息包括了参数名和非法值,而这对于找到错误的原因是很重要的。

  5.避免过度使用checked exception

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

  6.将checked exception转为runtime
exception

  这是在像Spring之类的多数框架中用来限制使用checked
exception
的技术之一,大部分出自于JDBC的checked
exception
,都被包装进DataAccessException中,而(DataAccessException)异常是一种unchecked
exception

  这是Java最佳实践带来的好处,特定的异常限制到特定的模块,像 SQLException 放到DAO层,将意思明确的运行时异常抛到客户层。

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

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

  8.避免catch块为空

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

  对于在Java编程中编写异常处理代码,这不仅仅是一个Java最佳实践,而是一个最通用的实践。

  9.使用Jdk标准异常

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

  10.Javadoc记录异常

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

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

【转】Java中关于异常处理的十个最佳实践,布布扣,bubuko.com

时间: 2024-10-26 08:12:16

【转】Java中关于异常处理的十个最佳实践的相关文章

Java中的异常处理机制

Java中的异常处理机制 示例 public class test { public static void main(String[] args) { // TODO Auto-generated method stub String s="hello"; int i=Integer.parseInt(s); } } 运行异常结果 在上述代码中Integer.parseInt表示把字符串类型转化成整数类型,同时Integer是Int的封装类:程序会报错,因为计算机没有办法把hello

Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间.地点.人物.情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息. Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Erro

深入了解 Java 中的异常处理 + 面试题

# 深入了解 Java 中的异常处理 + 面试题 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点.比如,try-catch 处理要遵循的原则是什么,finally 为什么总是能执行,try-catch 为什么比较消耗程序的执行性能等问题,我们本讲内容都会给出相应的答案,当然还有面试中经常被问到的异常模块的一些面试题,也是我们本篇要讲解的重点内容. 异常处理基础介绍 先来看看异常处理的语法格式: try{ ... } catch(Exception e){

attilax.java 注解的本质and 使用最佳实践(3)O7

attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 5. 读取注解 2 6. 不能读取到注解,为null的解决 3 7. 参考: 3 1. 定义pojo public class pojo { @Validate("required") String name; int id; @Validate("required")

Java中的异常处理从概念到实例

1.概念 采用新的异常处理机制 在以往的程序开发过程中,经常采用返回值进行处理.例如,在编写一个方法,可以返回一个状态代码,调用者根据状态代码判定出错与否.若状态代码表示一个错误,则调用这进行相应的处理,或显示一个错误页面或错误信息.通过返回值进行处理的方法是有效的,但是有它的许多不足之处. 1. 程序复杂 2. 可靠性差 3. 返回信息有限 4. 返回代码标准化困难 采用错误代码和异常处理相结合的方式的优越性: 1. 把错误代码与常规代码分开 2. 可以在catch中传播错误信息 3. 可以对

Java中实现异常处理的基础知识

异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. 源代码示例: package yanzheng; //关于异常  2015.11.11 import javax.swing.*; public class AboutException { public static void main(String[] args) { int i=1, j=0, k; //   k=i/j; 

java中的异常处理原理浅谈

什么是异常呢: 在现实生活中,总会有一些问题,聚焦在生活上,我们会有工作问题,比如工作不满意,工作薪水低,工作没有发展前景,那么我们会成为这是一个“问题”. 在java的世界中,那么我们相对应的是程序,那么程序也有这样或者那样的问题,那么我们成为“异常”.异常就是程序在运行时出现的不正常现象. java把异常封装成对象的描述,来高度的概括. java中Error我们无能为力.我们还是聊聊Exception Exception的分类: 1.编译时异常 必须进行捕获 2.运行时异常(也就是Runti

牛刀小试 - 趣谈Java中的异常处理

概述 顾名思义,通俗来讲异常就是指,那些发生在我们原本考虑和设定的计划之外的意外情况. 生活中总是会存在各种突发情况,如果没有做好准备,就让人措手不及. 你和朋友约好了明天一起去登山,半道上忽然乌云蔽日,下起了磅礴大雨.这就是所谓的异常情况. 你一下子傻眼了,然后看见朋友淡定的从背包里掏出一件雨衣穿上,淫笑着看着你.这就是对异常的处理. 对于一个OO程序猿来讲,所做的工作就是:将需要处理的现实生活中的复杂问题,抽象出来编写成为程序. 既然现实生活中总是存在着各种突然的异常情况,那么对应其抽象出的

初探Java中的异常处理

Java中的异常有下面几种: 1) Error:Java运行时的内部错误: 2) Exception:程序中应该捕获的异常. RuntimeException:由于编程产生的错误: IOException:输入输出产生的错误. 异常处理的方法: 1)try-catch try语句块只能有一个,而catch可以有多个,catch必须紧跟try语句,中间不能有其他代码.如果有多个catch语句,那么捕获父类异常的catch语句必须放在后面,否则它会捕获它的所有子类异常,而使得子类异常catch语句永