2019年3月8日08:58:23
- 《 effective java》总结:
一、异常用于异常情况使用而设计,不要用于普通控制流;
二、java目前有三种可抛出结构:受检异常(checked exception)、运行时异常(run-time exception)、错误(error);
三、“受检异常=》未受检异常”:将抛异常方法分成两个方法:一个是返回一个boolean,表明是否抛异常;
if(obj.actionPermitted(args)){
obj.action(args);
}else{
//Handle exception condition
}
四、异常转译(exception translation):更高层的实现,应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常;
五、异常文档:就是每个异常最好都辅以说明;
六、异常的细节信息,应该包含所有“对异常有帮助”的参数和域值;系统会自动打印该异常的堆栈轨迹(确切文件和行号,其他方法调用所在的文件和行数),异常的字符串表示法(string representation)主要是让开发者分析失败的原因;
一个方法是,在异常的构造器引入,而不是字符串细节信息引入这些消息;
七、异常失败,应该保持原子性:失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为“具有失败原子性”:
public synchronized E pop() {
if(size == 0){
throw new EmptyStackException();
}
int var2 = this.size();
Object var1 = this.peek();
this.removeElementAt(var2 - 1);
return var1;
}
第二种,写恢复代码(不常用);
第三种,在临时拷贝上操作,操作结束后替代对象内容;(常用,eg:Collections.sort,实际上排序是对ArrayList的数组进行拷贝后,进行操作后再return;可以详细看源码实现)
T[] aux = copyOfRange(a, fromIndex, toIndex);
八、try..catch..中的catch字句模块,要写点有用的信息;别忽略掉异常。
Java编程常用异常
异常 | 使用场合 |
IllegalArgumentException | 非null的参数值不正确 |
IllegalStateException | 对于方法调用而言,对象状态不合适 |
NullPointerException | null参数 |
IndexOutOfBoundsException | 下标参数值越界 |
ConcurrentModificationException | 并发修改 |
UnsupportedOperationException | 对象不支持用户 |