Java基础之异常

1 父类异常与子类异常之间的捕获关系

1.1 问题

public class Annoyance extends Exception {

}
public class Sneeze extends Annoyance {

}
public class Human {
    public static void main() {
        try {
            try {
                throw new Sneeze();
            } catch (Annoyance a) {
                System.out.println("Caught Annoyance");
                throw a;
            }
        } catch (Sneeze s) {
            System.out.println("Caught Sneeze");
            return;
        } catch (Exception e) {
            System.out.println("Caught Exception");
            e.printStackTrace();
        } finally {
            System.out.println("Hello World!");
        }
    }
}

1.2 结果分析

最上面的代码执行结果是什么呢?答案是:

Caught Annoyance
Caught Sneeze
Hello World!

经过断点的加入,我们发现,尽管
catch (Annoyance a)
这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现,在
catch (Sneeze s)
的时候当然可以捕获到自己抛出来的异常了

1.3 证明:子类从本质上无法捕获父类的异常,继续做个试验

try {  
	throw new Annoyance();  
} catch (Sneeze s) {  
    System.out.println("Caught Sneeze");  
    return;  
} finally {  
    System.out.println("Hello World!");  
} 

抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?

W/System.err: com.example.administrator.demo.exception.Annoyance
W/System.err:     at com.example.administrator.demo.exception.Human.main(Human.java:15)
W/System.err:     at com.example.administrator.demo.MainActivity.onCreate(MainActivity.java:56)
W/System.err:     at android.app.Activity.performCreate(Activity.java:6010)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)

可以看到,出了问题了,也就是说:父类throw出来的异常,子类并没有捕获到,继续往下证明

try {
	try {
        throw new Annoyance();
   } catch (Annoyance a) {
        System.out.println("Caught Annoyance");
        throw a;
   }
} catch (Sneeze s) {
   System.out.println("Caught Sneeze");
   return;
} catch (Exception e) {
   System.out.println("Caught Exception");
   e.printStackTrace();
} finally {
   System.out.println("Hello World!");
}

既然子类捕获不了,那就使用Exception,可以看到结果如下:

Caught Annoyance
Caught Exception

1.4 结论

(1)父类throw出来的异常,子类并没有捕获到;
(2)子类throw出来的异常,父类并没有捕获到。

1.5 学习链接

java异常-父类异常与子类异常之间的捕获关系

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值