java 异常处理面试题_一道面试题,关于java的异常处理的

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值