肯定是不能捕捉的。但是看下面这个例子
class Annoyance extends Exception {
}
class Sneeze extends Annoyance {
}
class Human {
public static void main(String[] args)
throws Exception {
try {
try {
throw new Sneeze();
} catch ( Annoyance a ) {
System.out.println("Caught Annoyance");
throw a;
}
} catch ( Sneeze s ) {
System.out.println("Caught Sneeze");
return ;
} finally {
System.out.println("Hello World!");
}
}
}
输出结果:
Caught Annoyance
Caught Sneeze
Hello World!
第一行第三行都能理解,为什么会输出Caught Sneeze呢 ?
刚开始我也很奇怪,以为子类是可以捕捉到父类的, 但是这不符合常理 ,于是使用debug试了一下
try {
throw new Sneeze();
} catch ( Annoyance a ) {
System.out.println("Caught Annoyance");
throw a;
}
由于Sneeze 是 Annoyance的子类, catch 中的( Annoyance a ) 一定是捕捉到了异常,但是这里由于java的多态机制 Annoyance a 的值却是 他的子类。也就是
Annoyance a = new Sneeze();
从debug可以看的很清楚
这也是为什么 catch ( Sneeze s ) 可以捕捉到 Annoyance a 了
a指向的就是Sneeze!