充分发挥异常的优点, 可以提高程序的可读性, 可靠性和可维护性.
第 57 条 只针对异常的情况才使用异常
第 58 条 对可恢复的情况使用受检异常, 对编程错误使用运行时异常
* 如果期望调用者能够适当的恢复, 使用受检异常.
* 大多数的运行时异常都表示前提违例(precondition violation), 如 ArrayIndexOutOfBoundsException.
* 错误往往被 JVM 保留用于表示资源不足, 约束失败, 或其他无法继续执行的条件. 最好不要再实现任何新的 Error 子类.
第 59 条 避免不必要的使用受检的异常
第 60 条 优先使用标准的异常
* 常用异常: IllegalArgumentException,IllegalStatusException,NullPointerException,IndexOutOfBoundsException,ConcurrentModificationException,UnsupportedOperationException 等.
第 61 条 抛出与异常相对于的异常
* 更高层的实现应该捕获底层的异常, 同时抛出可以按照高层抽象进行解释的异常. 这种做法被称为异常转义(exception translation), 如 AbstractSequentialList 类的例子:
- public E get(int index) {
- try {
- return listIterator(index).next();
- } catch (NoSuchElementException exc) {
- throw new IndexOutOfBoundsException("Index:"+index);
- }
- }
* 也可以使用异常链 (exception chaining) 的形式来进行转义, 即将底层的异常作为参数传入高层异常.
第 62 条 每个方法抛出的异常都要有文档
* 始终要单独的声明受检异常, 并利用 Javadoc 的 @throws 标记准确的记录下抛出异常的每个条件.
* 如果一个类的许多方法出于同样的原因而抛出同一个异常, 在该类的文档注释中对这个异常建立文档, 是可以接受的.
第 63 条 在细节消息中包含能捕获失败的信息
第 64 条 努力使失败保持原子性
* 一般而言, 失败的方法调用应该使对象保持在被调用之前的状态. 具有这种属性的方法被称为具有失败原子性(failure atomic).
* 获得失败原子性的方法:
(1)在执行操作之前检查参数的有效性.
(2)调整计算处理过程的顺序, 是的任何可能会失败的计算部分都在对象状态被修改前发生.
(3)编写一段恢复代码(不常用).
(4)在对象的一份临时拷贝上执行操作, 当操作完成后在用临时拷贝中的结果代替对象的内容.
第 65 条 不要忽略异常
* 至少, catch 块也应该包含一条说明, 解释为什么可以忽略这个异常.
来源: https://www.cnblogs.com/laishenghao/p/effective_java_note_exception.html