2017-04-02 170 views
0

下面是一個正在傳播異常處理機制的問題,期望的輸出是Exception.Can任何人都可以解釋爲什麼輸出是Exception,謝謝提前。核心-java異常處理

Class Question { 

    public void m1() throws Exception { 

    try { 

    m2(); 

    } finally { 

    m3(); 

    } 
    } 
    public void m2() throws RuntimeException { 

    throw new RuntimeException(); 

    } 

    public void m3() throws Exception { 

    throw new Exception(); 

    } 
    public static void main(String[] args) throws Exception { 

    Question q = new Question(); 

    try { 

    q.m1(); 

    } catch (RuntimeException re) { 

    System.out.println("RuntimeException"); 

    } catch (Exception e) { 

    System.out.println("Exception"); 
    } 
    } 
+0

因爲m1'拋出Exception' – Ravi

+0

如果在finally塊中我調用m2()方法whats輸出? –

+0

如果在finally塊中我調用m2()方法whats的輸出? RuntimeException – developer

回答

0

下面的步驟發生,因爲在程序執行的一部分:

(1)main()調用m1()

(2)m1()方法try塊調用平方米(),其拋出RuntimeException

(3)m1()方法finally塊調用m3()拋出Exception

(4)Exception將被拋出回到其是main()

(5)在您的main()方法Exception對象將被捕獲並打印字符串「異常」

關鍵點呼叫者方法是finally塊得到始終執行,即使有(在您的代碼中,try塊拋出RuntimeException)由try塊引發。

if finally finally block call m2()method whats the output?

在這種情況下輸出將是RuntimeException

+0

不是一個正確的答案,即使異常被捕獲或不被捕獲最後會被調用...如果異常被catch塊捕獲它將執行catch塊語句然後finally塊 –

+0

是的,當然,'catch'塊(if存在)將首先然後「最終」 – developer

0

所需的輸出是Exception.Can任何人解釋爲什麼輸出 異常

因爲finallytry之後執行的最後一塊:

finally { 
    m3(); 
} 

對於你Exception而不是RuntimeException

0

因爲當finally語句被執行時,調用m3()並且它拋出Exception
因此,即使RuntimeException在finally聲明的範圍之前上升,如果finally子句也引發另一個異常,則不考慮RuntimeException

14.18. The throw Statement JLS

如果有任何封閉嘗試,其試塊 包含throw語句,那麼任何最後的條款的嘗試 語句控制向外轉移被執行的語句(§14.20) ,直到 拋出的值被捕獲。 請注意,finally 子句的突然完成可能會中斷由語句 引發的控制權轉移。

0

下面是這個問題的程序執行: -

。第一個main()方法是調用m1()

。 m1()方法try塊調用m2()拋出RuntimeException

。然後m1()方法最後阻止正在調用m3()拋出異常

。異常將被拋回到main()(調用者方法)

。在main()方法中,異常將被捕獲並打印。