Java中的受检异常

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

受检异常

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

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

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

图 3.重新声明受检异常

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

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

受检异常恢复的原子性

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

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

1.使用不可变对象

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

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

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

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

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

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

java中必检异常有哪些_Java中的受检异常相关推荐

  1. java 异常继承树_java中的error与exception

    Error类和Exception类都继承自Throwable类. Error的继承关系: Exception的继承关系: 二者的不同之处: Exception: 1.可以是可被控制(checked) ...

  2. JAVA中的异常的触发_java中的异常

    在日常的程序开发中难免会出现遗漏并且就算代码没有问题可是由于程序运行环境的内存不够了,磁盘满了,网络连接问题等这些非正常的情况在java中都称之为异常.在java中对异常的处理有统一的异常处理机制,今 ...

  3. java敏感异常是什么_java中的异常是什么?

    Throwable(所有error和exception的父类:超类) Java将错误变成对象交给异常处理机制 Error(仅靠程序本身无法恢复的严重错误) 一般是环境的问题,JVM的问题,并非程序的问 ...

  4. java编译异常有哪些_java 中 哪些异常必须声明并捕获,否则产生编译错误

    RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类. 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws ...

  5. java异常类关键字_Java中的异常处理关键字是什么?

    java异常处理中使用了四个关键字. throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理.throw关键字用于向运行时抛出异常来处理它. throws:当我们在方法中抛出任何已检查的 ...

  6. java 异常 不抛_java中的不抛出的异常是什么

    RuntimeException与其子类和错误(Error)不是必须要捕获或抛出. Java异常Throwable分为两类:Error和Exception,Error类是错误,程序本身不能处理的. E ...

  7. java中三种可能导致异常的情况_JAVA基础知识点之异常

    一.JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描 ...

  8. java中的重写与重载_java中的重写与重载

    1.重写 重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的:若 ...

  9. java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?

    这篇文章开始讲解java中的注解,在平时的开发当中我相信你或多或少的接触过注解.比如你可能都见过@override,它代表的就是一个注解.但是,为了更加清晰的去介绍注解,我还是先给出一个例子,让你能够 ...

最新文章

  1. 查看存储过程死锁的存储过程
  2. Winform中设置ZedGraph的曲线为散点图
  3. apache php 单入口,apache配置php实现单一入口方法
  4. jboss linux 性能,搭建jprofiler对jboss性能监控
  5. 我以为信用卡多就是好事,谁知道……
  6. 如何给开源项目提过 PR 呢?其实很简单
  7. 【笔记】通过 js——实现 各种跨域
  8. RHEL5下构建Snort网络***检测系统
  9. 关于自然排序Comparable 和 比较器排序Comparator
  10. Ubuntu 20.04 安装CUDA11.1 和cudnn 8.0.5
  11. java 元祖_在java中对元组列表进行排序的有效方法
  12. fastreport实现动态列_excel中如何实现聚光灯效果?
  13. dos下的for命令详解(zz)
  14. python爬房源信息_Python爬取链家二手房源信息
  15. 计算机网络整理(上)
  16. python实现微信接龙统计
  17. 由ERP生产提前期的设定引发的思考
  18. Householder transformation + QL to calculate eigenValue and eigenVectors of Hertian Matrix, cpu code
  19. Windows构建Flutter环境,无法访问maven.google.com
  20. 【CSS】947- 十几个 CSS 高级技巧汇总

热门文章

  1. 电子书下载:C# 5.0 in a Nutshell 5th
  2. PCB设计标准工艺要求
  3. three 天空球_用three.js创建一个简易的天空盒
  4. 2020年P气瓶充装考试及P气瓶充装答案解析
  5. win7安装swoole
  6. 配色素描必备书籍分享
  7. java-手写ArrayList集合
  8. 淘宝秒杀脚本(python学习笔记)
  9. 全球及中国微型热电偶行业市场需求趋势与投资前景预测分析报告2022-2028年
  10. 计算机网络和互联网学习笔记