一开始看到这样的一段代码:
class ExampleA extends Exception {
}
class ExampleB extends ExampleA {
}
class Test {
public void main(String[] args) throws Exception{
try{
throw new ExampleB();
}catch(ExampleA e){
System.out.println("ExampleA");
}catch(Exception e){
System.out.println("Exception");
}
}
}
不用想这段代码一定输出的是ExampleA,因为能catch父类异常的地方一定能catch子类异常。
后来又看到这样一段:
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
Hello World!
但是测试结果却是:
Caught Annoyance
Caught Sneeze
Hello World!
当时就很郁闷,明明throw了一个Annoyance a,怎么会被他的子类Sneeze捕获呢,哪有子类捕获父类的道理,想了一会,突然灵光一现,试了一下在throw a之前加了一段代码:
System.out.println(a instanceof Sneeze);
果然输出了true,原来throw的a依然是之前的异常,只是利用多态性父类引用指向了子类对象,并没有另外抛出一个新的父类异常,乍一看还是挺有迷惑性的。