2013-02-22 82 views
0

我會通過下面的代碼:拋出運行時異常故意

public int returnSomething() { 
    try { 
     throw new RuntimeException("foo!"); 
    } finally { 
     return 0; 
    } 
} 

請解釋一下這段代碼是幹什麼。我的分析是我們正在拋出一個運行時異常,但之後,「finally」塊肯定會執行。那是對的嗎?

+1

那麼,當你嘗試它時發生了什麼,哪一點仍然讓你感到困惑? – 2013-02-22 06:52:58

+0

@JonSkeet返回0一個令人困惑.. – user2094103 2013-02-22 06:54:41

+0

你是否嘗試過?你是否研究了爲什麼你得到了你所做的結果? – 2013-02-22 06:57:34

回答

0

finally塊的內容總是被執行。我知道它不會執行的唯一原因是當你拔插頭或JVM崩潰時。所以我認爲這將返回0.

0

一個快速測試顯示,這將返回0,而不是傳播RuntimeException。

public class Test { 
    public static int returnSomething() { 
    try { 
     throw new RuntimeException("foo!"); 
    } finally { 
     return 0; 
    } 
    } 

    public static void main(String[] args) { 
    int i=returnSomething(); 
    System.out.println(i); 
    } 
} 
1

答案是在Java Language Specification section 14.20.2。你需要知道,返回算作「填寫突然」:

...

  • 如果try塊的執行突然完成,因爲值V的拋,再有就是選擇

    • [...]
    • 如果finally塊由於任何原因突然完成,然後try語句完成突然出於同樣的原因。

(所有路徑具有相同的最後一點,有一些稍微不同的寫法。)

所以總的結果是,返回0,異常被丟棄。

finally塊返回很少是一個好主意。