为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

凤凰求蛊 2018-07-31 17:00:01
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

查看完整回答
反对 回复 2018-08-06
?
哔哔one

TA贡献1854条经验 获得超8个赞

throw new Sneeze();

为何不能被?

} catch (Sneeze s) {
  System.out.println("Caught Sneeze");  
  return;
}


查看完整回答
反对 回复 2018-08-06
  • 2 回答
  • 0 关注
  • 1385 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信