异常经典面试题

问题:请看这个输出什么?

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

在这里插入图片描述
显然小瞧这种面试题的后果就是气的吐血,那么认真分析一波吧!

  1. 很明显这是一个try-catch的嵌套题目,首先做这种题之前,要理清继承关系
    在这里插入图片描述
  2. throw new Sneeze(); 抛出的对象是Sneeze类型的,是Annoyance的子类
  3. 由最近的catch (Annoyance a)来接收,于是输出Caught Annoyance,到这边一般没什么问题
  4. 然后再throw a; 这个a是什么类型的呢?如果认为是Annoyance类的,那么答案应该和我一样❌,如果认为是Sneeze,则正确。因此这是一个多态问题,可以看作Annoyance a = new Sneeze();父类引用指向子类对象,throw抛出的还是实际对象还是Sneeze类型,因此catch(Sneeze s)可以接收,输出:System.out.println(“Caught Sneeze”);
  5. 最后finally再输出Hello world

于是就是输出:

Caught Annoyance
Caught Sneeze
Hello world
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值