问题:请看这个输出什么?
public class TestException {
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
Hello world
自己在idea里面敲了一下
Caught Annoyance
Caught Sneeze
Hello world
显然小瞧这种面试题的后果就是气的吐血,那么认真分析一波吧!
- 很明显这是一个try-catch的嵌套题目,首先做这种题之前,要理清继承关系
- throw new Sneeze(); 抛出的对象是Sneeze类型的,是Annoyance的子类
- 由最近的catch (Annoyance a)来接收,于是输出Caught Annoyance,到这边一般没什么问题
- 然后再throw a; 这个a是什么类型的呢?如果认为是Annoyance类的,那么答案应该和我一样❌,如果认为是Sneeze,则正确。因此这是一个多态问题,可以看作Annoyance a = new Sneeze();父类引用指向子类对象,throw抛出的还是实际对象还是Sneeze类型,因此catch(Sneeze s)可以接收,输出:System.out.println(“Caught Sneeze”);
- 最后finally再输出Hello world
于是就是输出:
Caught Annoyance
Caught Sneeze
Hello world