問題:請看這個輸出什麼?
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