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 AnnoyanceCaught SneezeHello World!我的思路是这样的,首先抛出 throw new Sneeze();被它的父类Annoyance的catch块接受到,打印Caught Annoyance接着抛出父类Annoyance对象,该对象不能被子类接受到吧,所以应该是捕捉不到,但是程序运行的结果还是捕捉到了并打印Caught Sneeze。这是为什么呢?
2 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
你对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
哔哔one
TA贡献1854条经验 获得超8个赞
你
throw new Sneeze();
为何不能被?
} catch (Sneeze s) { System.out.println("Caught Sneeze"); return; }
添加回答
举报
0/150
提交
取消