effective java 读书笔记---第9章 异常

57.只针对异常的情况才使用异常
异常只用于异常的情况,永远不能用于正常的流程控制
设计良好的 api 不应该强迫它的客户端为了正常的控制流使用异常
如果类有特定的状态相关的方法,则类应该提供状态测试关联的方法,例如 iterator 中的方法 next()与 hasNext(),而不是在遍历时使用数组越界异常

58.对可恢复的情况使用受检异常,对编程错误使用运行时异常
java 中有三种可抛出结构:受检异常,运行时异常和 error
如果期望调用者能够适当的恢复,使用受检异常,强迫调用者在 catch中处理该异常,或者将它传播出去
有两种未受检的可抛出结构:运行时异常与错误,这两者在行为上相同,它们不会也不应该被捕获

59.避免不必要的使用受检异常
优先使用状态检查代替抛出异常,但如果状态检查,必须重复方法,此时可以使用抛出异常

60.优先使用标准的异常
常用异常:
IllegalArgumentException(非法参数) IllegalStateException(状态异常) NullPointerException(空指针) IndexOutOfBoundsException(数组越界)
ConcurrentModificationException (用在禁止多线程修改对象的地方)
UnsupportedOperationException(对象不支持所请求的操作,一般用作某些接口的实现类不支持某些方法)

61.抛出与抽象相对应的异常
更高层的实现应该捕获顶层的异常,同时抛出可以按照高层抽象进行解释的异常,这种方式被称为异常转译
异常链:可以将底层异常经过包装,传递到高层异常

62.每个方法抛出的异常都要有文档
始终单独的声明受检异常,并用@throw 标记,准确记录下抛出每个异常的条件,
永远不要声明方法 throws Exception 或者 throws Throwable
不要将未受检的异常包含在方法声明中
如果一个类中许多方法出于同样的原因而抛出同一个异常,在该类的文档注释中对这个异常建立文档,是可以接受的,而不是为每个方法建立文档

63.在细节消息中包含能捕获失败的信息
为了捕获失败,异常信息应该包含所有对该异常有贡献的参数和域的值,例如 IndexOutOfBoundsException应当包含 上界,下界以及没有落在界内的下标值
异常的细节消息不应该与用户层次的错误消息混为一谈
为了确保异常的细节消息包含足够信息,可以在异常构造器而不是字符串细节消息中引入这些信息

64.努力使失败保持原子性
在执行操作之前检查参数的有效性
调整计算处理过程,使得任何可能会失败的计算部分都在对象状态被修改之前发生
最后的方法时编写一段恢复代码来保证原子性
还有一种方法是在对象的临时拷贝上执行操作,操作完成后将临时拷贝的内容替换原有对象

65.不要忽略异常
catch 块中至少包含说明,解释为何可以忽略异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值