这个应该是下转型的问题
题主的问题简化成下面的样子会清晰点
Annoyance a=new Sneeze();
Sneeze s=(Sneeze)a;
这里没有做任何的类型转换,打印Caught Annoyance之后抛出的仍然是之前的对象,只是由父类型引用了。
你描述的情况是下面的情形:
public class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch (Annoyance a) { System.out.println("Caught Annoyance"); throw new Annoyance(); } } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } finally { System.out.println("Hello World!"); } } }
你对Java的类这个概念了解还不够,Sneeze是Annoyance的子类,意味着Sneeze一定是Annoyance,所以参数类型为Annoyance的时候,传递进去一个Sneeze实例并没有什么问题,这个实例在被抛出的时候当然会被捕获。有一段类似的代码你可以看看。
class Animal { void talk(){ System.out.print("I'm Animal"); } } class Human extends Animal { void talk(){ System.out.print("I'm Human"); } } class Main{ public static void main(String[] args) throws Exception { bark(new Human()); } static void bark(Animal a){ a.talk(); } }
在上面的代码中,为什么最后会打印I'm Human而不是I'm Animal
你
throw new Sneeze();
为何不能被?
} catch (Sneeze s) { System.out.println("Caught Sneeze"); return; }