美文网首页
第九章:异常

第九章:异常

作者: 胖当 | 来源:发表于2018-03-19 12:08 被阅读0次

记录《Effective Java》学习过程中的一些知识点,文章内容多引用自此书。


第57条:只针对异常的情况才使用异常

在现代的JVM实现上,基于异常的模式比标准模式要慢的多。异常(exception)是为了在异常情况下使用而设计的。不要将它们用于普通的控制流,也不要编写迫使它们这么做的API。

第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常(P215)

常见面试问题:讲讲你对java异常机制的理解(阿里质量保障部门)

java程序设计语言提供了三种可抛出结构(throwable):

受检的异常(checked exception)

运行时异常(run-time exception):表明编程错误。大多数运行时异常都表示前提违约。所谓前提违约是指API客户没有遵守API规范建立的约定。例如:数组访问的约定指明了数组的下标值必须在零和数组长度-1之间。ArrayIndexOutOfBoundsException表明这个前提被违反了。

错误(error):错误往往被JVM保留用于表示资源不足、约束失败、或者其他程序无法继续执行的条件。由于这已经是个几乎被普遍接受的惯例,因此最好不要再实现任何新的ERROR子类。因此,你实现所有unchecked 抛出结构都应该是RuntimeException的子类(直接或间接的)。

在决定受检的异常或是非受检的异常时,主要的原则是:如果期望调用者能够适当地恢复,就应该使用checked exception. 

通过抛出checked exception,强迫调用者在一个catch子句中处理该异常,或者将它传播出去。因此,方法中声明要抛出的每个受检的异常,都是对API用户的一种潜在指示:与异常相关联的条件是调用这个方法的一种可能的结果。

unchecked exception包括 run-time exception 以及 error.在行为上两者相同,都是不需要也不应该被捕获的可抛出结构。如果程序抛出unchecked exception,往往是属于不可恢复的情形,继续执行下去有害无益。如果程序没有捕捉到这样的可抛出结构,将会导致当前线程停止(halt),并出现适当地错误信息。

第59条:避免不必要的使用checked exception

第60条:优先使用标准的异常

常见面试问题:针对某段代码分析应该抛出什么异常

经常被重用的异常:

IllegalArgumentException:当调用者传递的参数值不合适的时候,往往会抛出这个异常。例如,假设一个参数代表了“某个动作的重复次数”,如果程序员给这个参数传递了一个负数,就会抛出这个异常。

IllegalStateException:如果因为接收对象的状态而使调用非法,通常就会被抛出这个异常。例如:如果在每个对象被正确初始化之前,调用者就企图使用这个对象,就会抛出这个异常。

可以说,所有错误的方法调用都可以被归结为非法参数或非法状态,但是其他还有一些标准异常也被用于某些特定情况下的非法参数和非法异常,如4,5.

如果调用者在某个不允许null值得参数中传递了null,习惯的做法就是抛出NullPointerException.

如果调用者在表示序列下表的参数中传递了越界的值,应该抛出IndexOutOfBoundsException.

如果一个对象被设计为专用于单线程或与外部同步机制配合使用,一旦发现它正在(或已经)被并发的修改,就抛出ConcurrentModificationException.

如果对象不支持所请求的操作,就会抛出UnsupportedOperationException.与上面讨论的其他异常相比,它很少用到,因为绝大多数对象会支持它们所实现的所有方法。如果接口的具体实现没有实现该接口所定义的一个或多个可选操作,它就可以使用这个异常。例如:对于只支持追加操作的List实现,如果有人试图从列表中删除元素,它就会抛出这个异常。

第61条:抛出与抽象相对应的异常

异常转译(exception translation):更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。

第62条:每一个方法抛出的异常都要有文档

第63条:在细节信息中包含能捕获失败的信息

第64条:努力使失败保持原子性

失败原子性(failure atomic):失败的方法调用应该使对象保持在被调用之前的状态。方法:设计一个不可变的对象,如果对象是不可变的,失败原子性就是显然的。

对于在可变对象上执行操作的方法,获得失败原子性 最常见的办法是:在执行操作之前检查参数的有效性。这可以使得在对象的状态被修改之前,先抛出适当地异常。

编写恢复代码,由它来拦截操作过程中发生的失败,以及使对象回滚到操作开始之前的状态上。

在对象的一份临时拷贝上执行操作,当操作完成之后,再用临时拷贝中的结果代替对象的内容。例如:Collections.sort在执行排序之前,首先把它的输入列表转到一个数组中,以便降低在排序的内循环中访问元素所需要的开销。这是出于性能考虑的做法,但是它增加了一项优势:即使排序失败,它也能保证输入列表保持一致。

不保持失败原子性的情况:如果两个线程企图在没有适当地同步机制的情况下,并发的修改同一个对象,这个对象就有可能被留在不一致的状态之中,因此,在捕获了ConcurrentModificationException异常之后再假设对象仍然是可用的,这就是不正确的。错误(相对于异常)通常是不可恢复的,当方法抛出错误时,它们不需要努力保持失败原子性。

第65条:不要忽略异常

有一种情况可以忽略异常,即关闭FileInputStream的时候。因为你还没有改变文件的状态,所以不用执行任何回复动作,并且已经从文件中读取到所需要的信息,因此不必终止正在进行的操作。

相关文章

  • 11月3日-4期C语言学习总结

    总结:今天学习第九章异常处理,主要学习异常的定义、为什么要异常、怎么自定义异常、异常处理中怎么嵌套TRY块。下午助...

  • 第九章:异常

    记录《Effective Java》学习过程中的一些知识点,文章内容多引用自此书。 第57条:只针对异常的情况才使...

  • 第九章、异常Exception

    第五十七条、只针对异常的情况才使用异常 不要优先使用基于异常的模式:因为异常机制的设计初衷是用于不正常的情况,所以...

  • 2017-11-3学习总结

    星期五 晴 今天代课王老师讲了异常处理。 内容很少,说是只做了解,能看懂就好。 下午练习第九章的习题, 助教也...

  • 11月3日四期C#总结

    今天学习第九章的异常处理机制。 嵌套的 try块:在try嵌套的时候,其处理过程有一条准则:从内到外,如果没有合适...

  • 灵劫(9)

    灵劫——目录 上一章:图书馆的传说 第九章:交错 周末的学校安静异常,大部分学生都回家了,但是还有少部分学生呆在学...

  • 【穿越小说】||风舞晴空【7】

    【第九章】一场孽缘 时光静静流淌,夜色缓缓而来,马车外的烈火神奇地消失了。车内宽阔异常,比一间房屋还大,云墨阳拿出...

  • 22/28 第九章读后感——反叛的意志力就如同青春期叛逆

    今日作业:阅读《自控力》第九章,并写下读后感。 读完今天这一章,我顺带着把第十章小结也读了,觉得异常的神奇,因为每...

  • 沉默者

    第九章 倩倩说着就开始脱衣服,她的那种皮裤两下就脱掉了,然后就是上衣,她的动作异常熟练,我仔细打量着面前这个裸体的...

  • 中国晚餐

    今天,我读了《 时代广场的蟋蟀 》的第九章。 第九章的题目叫做《 中国晚餐 》。第九章的意思:上一...

网友评论

      本文标题:第九章:异常

      本文链接:https://www.haomeiwen.com/subject/isnuqftx.html