次のコードを実行していました。
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
このコードが何をしているのか説明してください。私の分析では、メソッド内で実行時例外をスローしていますが、その後、「finally」ブロックは確実に実行されます。あれは正しいですか?
次のコードを実行していました。
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
このコードが何をしているのか説明してください。私の分析では、メソッド内で実行時例外をスローしていますが、その後、「finally」ブロックは確実に実行されます。あれは正しいですか?
答えは、Java 言語仕様のセクション 14.20.2にあります。返すことは「突然完了する」と見なされることに注意する必要があります。
...
値 V がスローされたために try ブロックの実行が突然完了した場合、選択肢があります。
- [...]
- 何らかの理由で finally ブロックが突然完了した場合、try ステートメントは同じ理由で突然完了します。
(すべてのパスは同じ最終ポイントを持ちますが、言葉遣いが若干異なります。)
したがって、全体的な結果は 0 が返され、例外は破棄されます。
finally
ブロックから戻ることはめったにありません。
簡単なテストでは、RuntimeExceptionを伝播する代わりに、これが0を返すことが示されています。
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);
}
}
finally ブロックの内容は常に実行されます。実行されないことがわかっている唯一の理由は、プラグを抜くか、JVM がクラッシュしたときです。だから私はこれが0を返すと思います。