异常
笔记:
exception:
1、只针对异常的情况才使用异常
2、对可恢复的情况使用受检异常,对编程错误使用运行时异常
三种可抛出结构:checked exception、 run-time exception、 error
如果期望调用者能适当地恢复,对于这种情况就应该使用受检的异常。通过抛出受检的异常,强迫调用者在一个catch子句中处理该异常,或者将它传播出去
两种未受检的可抛出结构:运行时异常和错误。在行为上两者是等同的:它们不需要也不应该被捕获的可抛出结构。如果程序抛出未受检的异常或者错误,往往就属于不可恢复的情形,急速执行下去有害无益。
用运行时异常来表示变成错误,大多数的运行时异常都表示前提违例,就是指API的客户没有遵守API规范建立的约定
异常也是个完整意义上的对象,可以在它上面定义任意的方法,为捕获异常的代码提供额外的信息。
3、避免不必要地使用受检的异常
4、优先使用标准的异常
IllegalArgumentException
IllegalStateException
NullPointException
IndexOutOfBoundsException
ConcurrentModificationException
UnsupportedOperationException
5、抛出与抽象相对应的异常
高层的实现应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译。
一种特殊的异常转译形式称为异常链,如果底层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。低层的异常被传到高层的异常,高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。高层异常的构造器将原因传入到支持链的超级构造器,因此它最终将被传给Throwable的其中一个运行异常链的构造器,例如Throwable:
class HigherLevelException extends Exception {
HigherLevelException(Throwable cause) {
super(cause);
}
}
6、每个方法抛出的异常都要有文档
是重要单独地声明受检的异常,并且利用javadoc的@throws标记,准确地记录下抛出每个异常的条件
对于接口中的方法,在文档中记录下它可能抛出的未受检异常显得尤为重要,这份文档构成了该接口的通用约定的一部分,它指定了该接口的多个实现必须遵循的公共行为。
7、在细节消息中包含能捕获失败的信息
当程序由于未被捕获的异常而失败的时候,系统会自动地打印出该异常的堆栈轨迹。在堆栈轨迹中包含该异常的字符串表示法,即它的toString方法的调用结果。它通常包含该异常的类名,紧随其后的是细节消息。
为了捕获失败,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值“。例如IndexOutOfBoundsException异常的细节消息应该包含下界、上界以及没有落在界内的下标值
8、努力使失败保持原子性
一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法称为具有失败原子性。
有几种途径可以实现这种效果:
最简单的方法莫过于设计一个不可变的对象,如果对象是不可变的,失败原子性就是显然的;对于在可变对象上执行操作的方法,获得失败原子性最常见的方法是,在执行操作之前检查参数的有效性。这可以使得在对象的状态被修改之前,先抛出适当的异常;
一种类似的获得失败原子性的办法是,调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象状态被修改之前发生;
第三种获得失败原子性的方法远远没有那么常用,做法是编写一段恢复代码,由它来拦截操作过程中发生的失败,以及使对象回滚到操作开始之前的状态上
最后一种获得失败原子性的办法是,在对象的一份临时拷贝上执行操作,当操作完成之后,再用临时拷贝中的结果代替对象的内容
9、不要忽略异常
至少,catch快也应该包含一条说明,解释为什么可以忽略这个异常
有关代码:
package chapter8; import java.util.ListIterator; import java.util.NoSuchElementException; /** * @author zhen * @Date 2018/10/9 14:04 */ public class Demo <E> { // public E get(int index) { // ListIterator<E> i = listIterator(index); // try{ // return i.next(); // }catch (NoSuchElementException e) { // throw new IndexOutOfBoundsException("Index:" + index); // } // } }

浙公网安备 33010602011771号