0

次のコードを実行していました。

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

このコードが何をしているのか説明してください。私の分析では、メソッド内で実行時例外をスローしていますが、その後、「finally」ブロックは確実に実行されます。あれは正しいですか?

4

3 に答える 3

1

答えは、Java 言語仕様のセクション 14.20.2にあります。返すことは「突然完了する」と見なされることに注意する必要があります。

...

  • 値 V がスローされたために try ブロックの実行が突然完了した場合、選択肢があります。

    • [...]
    • 何らかの理由で finally ブロックが突然完了した場合、try ステートメントは同じ理由で突然完了します。

(すべてのパスは同じ最終ポイントを持ちますが、言葉遣いが若干異なります。)

したがって、全体的な結果は 0 が返され、例外は破棄されます。

finallyブロックから戻ることはめったにありません。

于 2013-02-22T07:00:39.827 に答える
0

簡単なテストでは、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);
  }
}
于 2013-02-22T06:59:35.987 に答える
0

finally ブロックの内容は常に実行されます。実行されないことがわかっている唯一の理由は、プラグを抜くか、JVM がクラッシュしたときです。だから私はこれが0を返すと思います。

于 2013-02-22T06:56:21.750 に答える