異常經典面試題

問題:請看這個輸出什麼?

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章