受检异常是java程序语言设计的一项很好的特性。与返回代码不同,他们强迫程序员处理异常的条件,大大增强了可靠性。也就是说,过份的使用受检异常会使API使用起来非常不方便。如果方法抛出一个或者多个受检异常,调用该方法的代码就必须再一个或者多个catch块中处理这些异常,或者他必须声明他抛出这些异常,并让他们传播出去。无论哪种方法,都给程序员增添了不可忽略的负担。
如果正确的使用API并不能阻止这种异常条件的产生,并且一旦产生异常,使用API的程序员可以立即采取有用的动作,这种负担就被认为是正当的。除非这两个条件都成立,否则更适合于使用未受检的异常。作为一个“石蕊”测试,你可以试着问自己:程序员将如何处理该异常。下面做法是最好的吗?
}catch(TheCheckedException e){ throw new AssertionError(); }
下面这种做法如何?
}catch(TheCheckedException e){ e.printStackTrace(); System.exit(1); }
如果使用API的程序员无法做的比这更好,那么未受检的异常可能更为合适。这种例子就是CloneNotSupportedException。他就是Object,clone抛出来的,而Object.clone应该只是在实现了 Cloneable的对象上才可以被调用。在实践中catch块几乎总是具有要付出努力,还使程序更为复杂。
被一个方法单独抛出的受检异常,会给程序员带来非常高的额外负担。如果这个方法还有其他的受检异常,他被调用的时候一定已经出现再一个try块中,所以这个异常只需要另外一个catch块。如果方法抛出单个受检异常仅仅一个异常就会导致该方法不得不外与try块中,在这些情况下,应该问问自己,是否有别的路径来避免使用受检异常。
“把受检异常变成未受检异常”的一种方法是,把这个抛出异常的方法分成两个方法,其中一个方法返回一个boolean,表明是否应该抛出异常。这种API重构,把下面的调用序列:
try{ obj.action(args); }catch(TheCheckException e){ }
重构为:
if(obj.actionPermitted(args)){ obj.action(args); }catch(TheCheckException e ){ }
这种重构并不总是恰当的,但是,凡是在恰当的地方,他都会使API用起来更加舒服,虽然后者的调用序列没有前者漂亮,但是这样得到的API更加灵活。如果程序员知道调用将会成功,或者不介意由于调用失败而导致的线程终止,这种重构还允许以下更为简单的调用形式:
obj.action(args);
如果你怀疑这个简单的调用序列是否符合要求,这个API重构可能就是恰当的,。这种重构之后的API在本质上等同于异常的“状态测试方法“,并且,同样的告诫依然适用:如果对象将在缺少外部同步的情况下被并发访问,或者可被外界改变状态,这种重构就是不恰当的,因为在actionPermitted和action这两个调用的时间间隔之中,对象的状态有可能会发生变化,如果单独的actionPermitted方法必须重复action方法工作,处于性能的考虑,这种API重构就不值得去做。
相关推荐
如果正确地使用 API 并不能阻止这种异常条件的产生,并且一旦产生异常,使用 API 的程序员可以立即采取有用的动作,这种负担就被认为是正当的。「把受检异常变成
70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常Java 程序设计语言提供了三种 throwable:受检异常(checked exceptions
Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常与非受检异常 受检异常 非受检异常 Java异常关键字 Java异常处理 声明...
70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常Java 程序设计语言提供了三种 throwable:受检异常(checked exceptions
Java异常处理是编写健壮程序的关键方面之一。本资料将帮助您了解异常类层次结构、异常处理、抛出异常、自定义异常和最佳实践。 在Java中,异常被分为受检异常和非受检异常。受检异常需要在编译时进行处理,而非受检...
Java异常主要分为两大类:受检异常和非受检异常。受检异常需要在代码中显式处理,而非受检异常则可以由虚拟机自动处理。 Java异常的处理方式 Java异常的处理方式主要有捕获和抛出两种。捕获是指当异常发生时,程序会...
02 了解Java异常体系结构,以及受检异常和未受检异常的区别。 03 掌握使用try-catch-finally语句块捕捉并处理异常。 05 掌握设计和使用用户自定义异常。 04 掌握使用throw语句抛出异常,以及使用throws语句声明方法...
Checked Exception(受检的异常)2---马克-to-win java视频
1. Java异常简介 2. Java异常架构 3. Exception(异常) 4. 受检异常与非受检异常 3. Java异常关键字 3. Java异常处理
Checked Exception(受检的异常)1---马克-to-win java视频
主要介绍了Java并发编程示例(八):处理线程的非受检异常,Java为我们提供了一种机制,专门用于处理由Thread对象抛出的非受检异常,以避免程序的退出,需要的朋友可以参考下
所有异常都是Throwable的子类,分为Error(致命异常)和Exception(非致命异常)。Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控...Exception又分为checked异常(受检异常)和unchecked异常(非受检异常)。
Java面试大全是一套最新Java面试必问合集,这本面试手册包含了Java基础、Java集合、JVM、Spring、Spring Boot、Spring Cloud、Mysql、Redis、RabbitMQ、Dubbo、Netty、分布式及架构设计等方面的技术点。内容难度参差...
2. 运行时异常和一般异常(受检异常)区别是什么? 3. JVM 是如何处理异常的? 4. throw 和 throws 的区别是什么? 5. final、finally、finalize 有什么区别? 6. NoClassDefFoundError 和 ClassNotFoundException ...
Oracle数据库中的异常:没有异常的转移,因为没有受检异常和非受检异常得区分。 1.异常的产生: 2.异常的处理: declare –变量定义,初始化赋值。 begin –变量的赋值,函数调用,if,while等。 ...
三.Exception类及其子类(不包含非受检查异常)表示的是受检异常,这是程序员必须处理的异常,不处理则程序不能通过编译,比如IOException表示I/O异常,SQLException表示数据库访问异常. 我们知道 一个对象的创建,需要...
常见类型X射线摄影所致受检者剂量评价,刘海宽,卓维海,目的 研究常见类型医用诊断X射线摄影所致受检者入射体表剂量、器官剂量以及全身有效剂量。方法 利用仿真人体模型,通过布放玻璃剂
数字化X射线摄影受检者入射体表剂量的估算,马天俊,刘海宽,目的 研究数字化X射线摄影所致受检者入射体表剂量估算模式,为快速评估受检者剂量水平提供技术支持。方法 基于辐射剂量学的概念与
文件加密受检