最終的にブロックでreturnステートメントを使用できますか。これは問題を引き起こす可能性がありますか?
finally
ブロック内から戻ると、exceptions
が失われます。
finallyブロック内のreturnステートメントは、tryまたはcatchブロックでスローされる可能性のあるすべての例外を破棄します。
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ステートメントは常に突然終了します。
はい、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ステートメントを記述する必要はありません。実際、これを記述するべきではありません。
はい、できますが、 finally block は特別な目的のためであるため、1であってはなりません。
最終的には、例外処理だけでなく、プログラマーがリターン、続行、またはブレークによって誤ってクリーンアップコードをバイパスすることを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。
内部にロジックを記述することはお勧めしません。