EffectiveJava学习笔记28:异常(上)-异常的适用范围、java的三种可抛出结构、抛出与抽象对应的异常

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);
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值