Java笔试题学习之15(异常捕获)

class A extends Exception{
    
}
class B extends A{
    
}
public class day15 {
    public static void main(String[] args) {
        try {
            try{
                throw new B();
            }catch (A a){
                System.out.println("Caught A");
                throw a;//这里的a指向了b对象,所以能被下面的catch捕获
            }
        }catch (B b){
            System.out.println("Caught B");
            return;
        }
        finally {
            System.out.println("Hello world");
        }
    }
}

输出:
Caught A
Caught B
Hello world

分析:
1、执行throw new B()语句后,抛出了B类型异常对象,因为B继承自A,第一个catch捕获的是A类型异常
所以在第一个catch中可以捕获到异常,同时发生向上转型(父类引用指向子类对象),即A类型应用执行了B类型对象
即第一个catch中的A类型引用a,指向B类型对象的。

2、执行throw a语句后,抛出的其实是B类型异常对象,所以可以被第二个catch捕获

3、finally块的内容一定会被执行

所以输出是:
Caught A
Caught B
Hello world

抛出异常B之后,在catch(A a)中,向上转型,A类型引用 a 指向了其子类型B的异常

你可能感兴趣的:(Java笔试题学习)