web-dev-qa-db-ja.com

finallyブロックで「return」を使用できますか

最終的にブロックでreturnステートメントを使用できますか。これは問題を引き起こす可能性がありますか?

37
Rakesh KR

finallyブロック内から戻ると、exceptionsが失われます。

finallyブロック内のreturnステートメントは、tryまたはcatchブロックでスローされる可能性のあるすべての例外を破棄します。

Java言語仕様:

Tryブロックの実行が他の理由Rで突然完了した場合、finallyブロックが実行され、その後、選択肢があります。

   If the finally block completes normally, then the try statement
   completes  abruptly for reason R.

   If the finally block completes abruptly for reason S, then the try
   statement  completes abruptly for reason S (and reason R is
   discarded).

注: JLS 14.17 によると-returnステートメントは常に突然終了します。

44
Ankur Lathi

はい、finallyブロックにreturnステートメントを記述できます。これにより、他の戻り値がオーバーライドされます。

編集:
以下のコードの例

public class Test {

    public static int test(int i) {
        try {
            if (i == 0)
                throw new Exception();
            return 0;
        } catch (Exception e) {
            return 1;
        } finally {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(test(0));
        System.out.println(test(1));
    }
}

Finallyブロックから2を返すため、出力は常に2です。例外があるかどうかにかかわらず、最終的には常に実行されることを忘れないでください。したがって、finallyブロックを実行すると、他のブロックの戻り値がオーバーライドされます。 finallyブロックにreturnステートメントを記述する必要はありません。実際、これを記述するべきではありません。

27
Krushna

はい、できますが、 finally block は特別な目的のためであるため、1であってはなりません。

最終的には、例外処理だけでなく、プログラマーがリターン、続行、またはブレークによって誤ってクリーンアップコードをバイパスすることを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。

内部にロジックを記述することはお勧めしません。

3
Suresh Atta