Java 理论与实践: 关于异常的争论

2016-02-19 18:38 3 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐Java 理论与实践: 关于异常的争论,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

  关于在 Java 语言中使用异常的大多数建议都认为,在确信异常可以被捕捉的任何情况下,应该优先使用检查型异常。语言设计(编译器强制您在方法签名中列出可能被抛出的所有检查型异常)以及早期关于样式和用法的著作都支持该建议。最近,几位闻名的作者已经开始认为非检查型异常在优秀的 Java 类设计中有着比以前所认为的更为重要的地位。在本文中,Brian Goetz 考察了关于使用非检查型异常的优缺点。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  与 C++ 类似,Java 语言也提供异常的抛出和捕捉。但是,与 C++ 不一样的是,Java 语言支持检查型和非检查型异常。Java 类必须在方法签名中声明它们所抛出的任何检查型异常,并且对于任何方法,假如它调用的方法抛出一个类型为 E 的检查型异常,那么它必须捕捉 E 或者也声明为抛出 E(或者 E 的一个父类)。通过这种方式,该语言强制我们文档化控制可能退出一个方法的所有预期方式。

  对于因为编程错误而导致的异常,或者是不能期望程序捕捉的异常(解除引用一个空指针,数组越界,除零,等等),为了使开发人员免于处理这些异常,一些异常被命名为非检查型异常(即那些继续自 RuntimeException 的异常)并且不需要进行声明。

  传统的观点

  在下面的来自 Sun 的“The Java Tutorial”的摘录中,总结了关于将一个异常声明为检查型还是非检查型的传统观点(更多的信息请参阅 参考资料):

  因为 Java 语言并不要求方法捕捉或者指定运行时异常,因此编写只抛出运行时异常的代码或者使得他们的所有异常子类都继续自 RuntimeException ,对于程序员来说是有吸引力的。这些编程捷径都答应程序员编写 Java 代码而不会受到来自编译器的所有挑剔性错误的干扰,并且不用去指定或者捕捉任何异常。尽管对于程序员来说这似乎比较方便,但是它回避了 Java 的捕捉或者指定要求的意图,并且对于那些使用您提供的类的程序员可能会导致问题。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  检查型异常代表关于一个合法指定的请求的操作的有用信息,调用者可能已经对该操作没有控制,并且调用者需要得到有关的通知 —— 例如,文件系统已满,或者远端已经关闭连接,或者访问权限不答应该动作。

  假如您仅仅是因为不想指定异常而抛出一个 RuntimeException,或者创建 RuntimeException 的一个子类,那么您换取到了什么呢?您只是获得了抛出一个异常而不用您指定这样做的能力。换句话说,这是一种用于避免文档化方法所能抛出的异常的方式。在什么时候这是有益的?也就是说,在什么时候避免注明一个方法的行为是有益的?答案是“几乎从不。”

  换句话说,Sun 告诉我们检查型异常应该是准则。该教程通过多种方式继续说明,通常应该抛出异常,而不是 RuntimeException —— 除非您是 JVM。

  在 Effective Java: Programming Language Guide 一书中,Josh Bloch 提供了下列关于检查型和非检查型异常的知识点,这些与 “The Java Tutorial” 中的建议相一致(但是并不完全严格一致):

  第 39 条:只为异常条件使用异常。也就是说,不要为控制流使用异常,比如,在调用 Iterator.next() 时而不是在第一次检查 Iterator.hasNext() 时捕捉 NoSUChElementException。

  第 40 条:为可恢复的条件使用检查型异常,为编程错误使用运行时异常。这里,Bloch 回应传统的 Sun 观点 —— 运行时异常应该只是用于指示编程错误,例如违反前置条件。

  第 41 条:避免不必要的使用检查型异常。换句话说,对于调用者不可能从其中恢复的情形,或者惟一可以预见的响应将是程序退出,则不要使用检查型异常。

  第 43 条:抛出与抽象相适应的异常。换句话说,一个方法所抛出的异常应该在一个抽象层次上定义,该抽象层次与该方法做什么相一致,而不一定与方法的底层实现细节相一致。例如,一个从文件、数据库或者 JNDI 装载资源的方法在不能找到资源时,应该抛出某种 ResourceNotFound 异常(通常使用异常链来保存隐含的原因),而不是更底层的 IOException、SQLException 或者 NamingException。

  重新考察非检查型异常的正统观点

  最近,几位受尊敬的专家,包括 Bruce Eckel 和 Rod Johnson,已经公开声明尽管他们最初完全同意检查型异常的正统观点,但是他们已经认定排他性使用检查型异常的想法并没有最初看起来那样好,并且对于许多大型项目,检查型异常已经成为一个重要的问题

来源:https://www.tulaoshi.com/n/20160219/1618444.html

延伸阅读
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动治理栈和堆,程序员不能直接地设置栈或堆。 !-- frame contents -- !-- /frame contents -- 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,...
太极拳视频 关于检验姿势与推手的理论 太极拳的推手是双人的练习,只有在实践中才能达到一定的效果。推手在太极去的实战技击中是经常运用到的技能,只有练好推手才能提高自身的技击水平,这里体现出了推手的重要性,也需要不断的去体会其中。 太极拳的姿势也很重要,姿势的正确与否影响着太极拳成果。 太极拳中有句名言...
import Java.awt.Point; import java.io.IOException; import com.sun.corba.se.impl.io.OptionalDataException; /**  * 克隆测试br  * 以方形类为例,比较了深克隆(deep clone)与浅克隆(shallow clone)的异同  *  * @see #clone()  * @author 88250  * @version 1....
 Java开源实践1--环境配置  wuder Window系统下的deploy所需软件: 以下软件为window下执行 Jdk5.0 下载地址:http://java.sun.com/j2se/1.5.0/download.jsp           jdk-1_5_0_01-windows-i586-p.exe Jboss4.01 ...
五十七、只针对异常情况才使用异常:       不知道你否则遇见过下面的代码: 代码如下:      try {               int i = 0;3        while (true)       ...

经验教程

989

收藏

32
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部