异常经典面试题

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

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
页面下部广告