"
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!
我的思路是这样的,首先抛出 throw new Sneeze();被它的父类Annoyance的catch块接受到,打印Caught Annoyance
接着抛出父类Annoyance对象,该对象不能被子类接受到吧,所以应该是捕捉不到,但是程序运行的结果还是捕捉到了并打印Caught Sneeze。
这是为什么呢?
"
"
你
throw new Sneeze();
为何不能被?
} catch (Sneeze s) {
System.out.println("Caught Sneeze");
return;
}
######
你对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
######这里没有做任何的类型转换,打印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!");
}
}
}
######
这个应该是下转型的问题
题主的问题简化成下面的样子会清晰点
Annoyance a=new Sneeze();
Sneeze s=(Sneeze)a;
"版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。