Effective Java笔记-第9章:异常

异常概述:

1. 异常分类case1:受检异常,未受检异常

2. 异常分类case2:受检异常(checked exception,必须被catch),运行时异常(run-time exception,可以catch,但不推荐,可通过state-test),错误(error,不可以catch)

3. Error:一般指的是和JVM相关的问题,如:系统崩溃,虚拟机错误,资源不足。Error无法恢复,不可catch,也不应该Throws。此时程序退出。绝对不应该实现新的Error子类

4. java语言设计哲学:

4.1 Checked Exception:可以修复(处理)的,所以java设计成为,必须显式处理[编译器检查]。如果没有处理,无法通过编译。如:IOException

4.2 Runtime Exception:更加灵活,不需要显式声明/抛出[运行时才发生,编译器没办法检查]。如果需要,可以用try-catch捕获。如:NullPointerException,数组index越界

5. 自定义Exception:应该继承Exception/RuntimeException,不应该实现Throwable[JLS(java语言规范)隐式指出,Throwable的实现类和Exception子类行为上等同,这样做会困扰用户]

6. java异常类的继承体系:



第57条:只针对异常的情况才使用异常

1. 使用JVM,异常处理机制做优化,是愚蠢的

2. 代码放在 try-catch 中会阻止 JVM 本来要执行的一些优化

3. 方法常常需要:知道执行结果。三种方式:异常,返回值,状态测试方法

3.1 异常:例如android蓝牙2.0连接的过程,没有抛出异常,即说明连接成功

3.2 返回值:返回null[某些方法不能准确判断返回结果,如:Iterator.next(),null是合法的返回值],或者Bool,int code[C/C++中用的多]作为执行的的结果

4. 例子:状态测试方法:if(Iterator.hasNext())      状态相关方法:Iterator.next()

5. 优秀的设计:让bug明显,容易查找

6. 状态测试方法 VS 返回值

6.1 使用返回值case1:缺少同步的情况下,有并发,对象被访问。状态,可能在 “状态测试” 和 “状态相关” 调用之间被改变

6.2 使用返回值case2:单独的 “状态测试” 必须重复调用 “状态相关”,性能上考虑,应该用返回值

6.3 使用 “状态测试” :1.可读性更高    2.对于使用不当的情况,易于检测和改正:调用“状态相关” 之前,没有调用“状态测试” ,则抛出异常,使得这个bug明显。如果忘了检查返回值,这个bug就很难被发现。例如:Thread.start() 重复执行的时候,会抛出异常


第58条:可恢复情况使用“受检异常”,编程错误使用“运行时异常”

1. java中有三种可抛出结构(throwable):受检异常(checked exception,必须被catch),运行时异常(run-time exception,可以catch),错误(error,不可以catch)

2. 受检异常:期望调用者能够适当恢复。强迫使用者在catch中处理此异常,或者throw到出去。提示:抛出异常是调用此方法的一种可能结果[catch后不处理是不好的]

3. 运行时异常,错误:代表程序不可恢复,继续执行下去有害无益。如果程序没有catch,则会导致当前线程停止

4. 运行时异常:表明变成有错误,表示 “提前违例”,也就是:用户没有遵循API的要求。如:NullPointerException,应该检查对象是否为null


第59条:避免不必要的使用受检异常

1. 受检异常和方法返回值的区别:受检异常强迫程序员处理以后吃那个,可增强可靠性

2. 如果方法仅仅抛出一个Exception,


第60条:优先使用标准的异常

1. 考虑到代码重用,应该优先使用标准的异常,java库提供了一些基本的 “未受检的异常”

2. 优点:和大家保持一致,提高可读性,减少陌生的代码,可以提高效率[少加载几个类]

3. 常用的异常

3.1 IllegalArgumentException                  非null的参数值不正确。如:某个参数表示Person的个数,此参数为负数

3.2 IllegalStateException                          调用某个对象的时候,此对象的状态不合适。如:对象被正确的初始化之前,被调用[请注意理解:正确的初始化]

3.3 NullPointerException                          参数不应该为Null的情况下,使用null

3.4 IndexOutOfBoundsException            索引越界

3.5 ConcurrentModificationException    类禁止并发的情况下,发现类的实例被并发使用(并发修改)

3.6 UnsupportedOperationException     对象不支持用户请求的方法。如:自定义List,只允许Add/Insert,不允许Remove,调用Remove的时候,可以抛出此异常

4. 总结:使用标准的异常的时候,用哪个,存乎于心。这些异常并不互斥,没有标准,只有合适的





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值