我會通過下面的代碼:拋出運行時異常故意
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
請解釋一下這段代碼是幹什麼。我的分析是我們正在拋出一個運行時異常,但之後,「finally」塊肯定會執行。那是對的嗎?
我會通過下面的代碼:拋出運行時異常故意
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
請解釋一下這段代碼是幹什麼。我的分析是我們正在拋出一個運行時異常,但之後,「finally」塊肯定會執行。那是對的嗎?
finally塊的內容總是被執行。我知道它不會執行的唯一原因是當你拔插頭或JVM崩潰時。所以我認爲這將返回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);
}
}
答案是在Java Language Specification section 14.20.2。你需要知道,返回算作「填寫突然」:
...
如果try塊的執行突然完成,因爲值V的拋,再有就是選擇
- [...]
- 如果finally塊由於任何原因突然完成,然後try語句完成突然出於同樣的原因。
(所有路徑具有相同的最後一點,有一些稍微不同的寫法。)
所以總的結果是,返回0,異常被丟棄。
從finally
塊返回很少是一個好主意。
那麼,當你嘗試它時發生了什麼,哪一點仍然讓你感到困惑? – 2013-02-22 06:52:58
@JonSkeet返回0一個令人困惑.. – user2094103 2013-02-22 06:54:41
你是否嘗試過?你是否研究了爲什麼你得到了你所做的結果? – 2013-02-22 06:57:34