Java中的受检异常

Java提供了三种异常类型,受检异常(checked exception)、运行时异常(runtime exception)、错误(error)。那么这受检异常在实际开发中又有什么最佳实践呢?

受检异常

如果抛出的异常是可恢复的,同时我们也期望API的调用者捕获异常进行恢复处理,那么我们应该使用受检异常。受检异常会强迫API的使用者截获异常并恢复处理,或者进行声明继续抛出。

图 1.IDE工具提示需要针对受检异常进行处理

图 2.捕获受检异常并进行恢复处理

图 3.重新声明受检异常

总而言之,对于可恢复的情况,使用受检异常;如果不清楚是否可能恢复,则最好使用未受检异常。

虽然受检异常是Java语言一项很好的特性,它强迫程序员处理异常,大大增强程序的可靠性。但是过分的使用受检异常会使API使用非常不方便,调用者必须在catch块中处理所有的受检异常,或者调用者必须声明抛出这些受检异常。

受检异常恢复的原子性

对于受检异常来说,我们期望在执行某个操作失败的时候,对象仍然保持在一种定义良好的可用状态之中,这样我们就可以从异常中进行恢复。一般而言,失败的方法调用应该使对象保持调用之前的状态,即受检异常的原子性。

我们有以下方式可以实现受检异常的原子性

1.使用不可变对象

如果对象不可变,那么在对象实例化的时候就确定了其状态,以后再也不能发生改变了,所以方法的执行就不能修改对象的状态,只能通过新建对象作为返回参数。

2.提前检查参数的有效性

在执行可变对象的方法之前检查参数的有效性,是的对象的状态被修改之前,先抛出适当的异常,这是可变对象获取受检异常原子性最常见的方法。

3.编写拦截操作失败并回滚对象状态的恢复代码。

4.现在临时拷贝的对象上执行操作,当操作成功后再用临时拷贝中的结果代替对象的内容。

虽然一般情况下大家都希望实现受检异常的原子性,但是并非总是可以做到的,例如缺少同步机制,并发修改同一个对象的状态。即使有时可以轻松实现受检异常的原子性,但是其可能会险种的增加开销和复杂性,并不一定是人们所期望的。

Java中的受检异常的更多相关文章

  1. Java中常见的异常类型

    一. Java中常见的异常类 异常类 说明 ClassCastException 类型准换异常 ClassNotFoundException 未找到相应类异常 ArithmeticException ...

  2. Java中的ExceptionInInitializerError异常及解决方法

    当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常.如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行初始化 ...

  3. Java中运行时异常和非运行时异常什么鬼?

    Java中的异常分类 RuntimeException(也称unchecked exceptions,运行时异常) 就是我们在开发中测试功能时程序终止,控制台出现的异常.(一般来说,出现运行时异常基本 ...

  4. java中常见的异常(转)

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  5. java中常见的异常种类

    Java常见的异常种类 ------------------------------------------------------------------------------- java Exc ...

  6. java中接口的简单运用&java中的一些异常(运用myeclipse)

    package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...

  7. 深度分析:Java中如何如理异常,一篇帮你搞定!

    异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...

  8. java中的ConcurrentModificationException异常

    先看这样一段代码: List<String> list = new ArrayList<String>(); list.add("1"); list.add ...

  9. java中常见的异常

    空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:Arra ...

随机推荐

  1. C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-9240CE2738AE},HRESULT: 0x80004002

    要批量将PDF文件内容按页转换为图片,在写的过程过程遇到两个问题. 一,下载的SDK中,提示要引用COM组件Acrobat,但在我的电脑上就是看不到,只能看到Adobe Acrobat 7.0 Bro ...

  2. (转)selenuim-webdriver注解之@FindBy、@FindBys、@FindAll的区别

    selenium-webdriver中获取页面元素的方式有很多,使用注解获取页面元素是其中一种途径, 方式有3种:@FindBy.@FindBys.@FindAll.下文对3中类型的区别和使用场景进行 ...

  3. bootstrap表格内容跑到表格外面的处理办法

    http://stackoverflow.com/questions/21587813/bootstrap-responsive-table-content-wrapping td写下这个样式即可.& ...

  4. POJ 3057 Evacuation 二分图匹配

    每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...

  5. python课程第二周重点记录

    python课程第二周重点记录 1.元组的元素不可被修改,元组的元素的元素可以被修改(字典在元组中,字典的值可以被修改) 2.个人感觉方便做加密解密 3.一些方法的使用 sb = "name ...

  6. Bash Shell字符串操作

    转自:http://my.oschina.net/aiguozhe/blog/41557,并对内容作了验证修改. 1. 取长度 str="abcd" 2.查找子串的位置 貌似也只有 ...

  7. 调整static变量初始化顺序的一个办法

    // wrap the LaunchDir variable in a function to work around static/global initialization order stati ...

  8. MySQL提示符含义

    http://www.splaybow.com/post/mysql-prompt-introduce.html mysql> 准备好接受新命令. 说明:正常等待输入的提示符. -> 等待 ...

  9. Web调用FastReport的配置问题

    1.修改配置webconfig文件 IIS6: <system.web> <httpHandlers> <add path="FastReport.Export ...

  10. CentOS 6 中安装Node.js 4.0 版本或以上

    如果想在CentOS 6 中安装Node.js >4.0,如果通过以往的方式安装: wget http://nodejs.org/dist/v4.0.0/node-v4.0.0.tar.gz t ...