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. SQL Server 查询所有外键子父表关系

    SELECT table_name,fk_name,reference_table_name,fk_list_number,fk_detailFROM (SELECT object_name(f.ob ...

  2. 利用Maple推导向量方程的微分公式

    在某些几何软件的开发中,会要求写出一个向量方程的微分公式.对我而言,手工推导繁琐.易出错.且需要反复校验. 早就听说Mathematica, Maple这样的软件可以自动进行符号公式的推导,一直没有时 ...

  3. ElasticSearch 命令行管理工具Curator

    一.背景 elastic官网现在已经大面积升级到了5.x版本,然而针对elasticsearch的命令行管理工具curator现在仍然是4.0版本. 刚开始找到此工具,深深的怕因为版本更迭无法使用,还 ...

  4. 关于安装sql2012出现的netfx3功能问题

    这个问题需要下载framework3.5即可继续正常安装,所以说低版本的framework也是有必要安装的

  5. oracle,sqlserver同一个表两个字段和成一个列查询 (详询请加qq:2085920154)

    sql 同一张表开两个字段合成一个字段 例如   SQL tab 字段1 字段2 字段3 3 4 莫 合成 tab 字段1 字段2 3-4 莫     SQL SERVER select 字段1 + ...

  6. 解决JQuery.ajax.post乱码问题

    问题:昨天在进行项目功能实现时,利用了$.ajax吧数据post给服务,接着保存到cookie中,而数据中是带有中文的 我的post代码: comCarId=encodeURIComponent(co ...

  7. windows7安装python2.7及scrapy

    http://www.cnblogs.com/txw1958/archive/2012/07/12/scrapy_installation_introduce.html 第0步:当然是安装python ...

  8. bootstrap-datepicker使用

    $('.date').datepicker({ language: 'zh-CN', --指定格式 format: 'yyyy-mm', --格式要求 autoclose: true, --选择后是否 ...

  9. linux挂载数据盘

    http://jingyan.baidu.com/article/90808022d2e9a3fd91c80fe9.html

  10. 数据类型安全验证都交给TryParse吧

    C# 网站开发中 往往在编写后台代码中遇到从字符类型转换到其他类型.其实无需在单独验证字符串长度,是否为空等工作.直接用Tryparse转换,如果转换失败说明字符串的格式等有误.成功则再进一步验证转换 ...