1.只针对异常情况才使用异常
这里就是说不要将异常用于正常的控制流中。
例:
try{.....}catch(Exception e){.......}
不要在抛出异常时写正常的控制代码,因为异常机制是没有jvm优化的。所以异常应该只适用于异常情况
2.java的三种可抛出结构
java语言有三种可抛出结构:受检异常、运行时异常、错误
1.受检异常就是我们平常用于catch和throws的异常,和名字一样,有经过检查的异常。
比如:java.io.IOException java.sql.SQLException等等
2.运行时异常和错误都为未受检异常。为RuntimeException的子类
运行时异常指API客户没有遵循API规范的约定,比如:ArrayIndexOutOfBoundsException->数组下标超出范围的异常
错误:其它的异常错误。
注意:不必要时,不要使用受检异常,可以用ifelse代替的,就重构trycatch异常为ifelse结构。
3.抛出与抽象对应的异常
方法抛出(trycatch)的异常有时不符合方法方面的任务,那么可以使用异常转译;
异常转译:更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释得异常。
下面是书中案例:
public E get(int index) {
try {
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
NoSunchElementException是低层的异常,IndexOutOfBoundsException是高层异常。
这里介绍了一个特例:异常链
异常链:低层异常被传到高层异常,高层异常提供方法(Throwable的getCause方法)来访问低层异常
try{
... //Use lower-level abstraction to do our bidding
}cache(LowerLevelException cause){
throw new HigherLevelException(cause);
}