aymnkt
@aymnkt

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

catchブロックとfinallyブロック内2つにreturnがある場合の動きについて

Q&A

Closed

解決したいこと

catchブロックとfinallyブロックそれぞれにreturnが記述されている場合の動きについて。

該当するソースコード

public class Main {
	public static void main(String[] args) {
		int ans = test();
		System.out.println(ans);
	}
	private static int test() {
		try {
			throw new RuntimeException();
		} catch (RuntimeException e) {
			return 1;
		} finally {
			return 2;
		}
	}
}

自分で試したこと

finallyにreturnを記述するのはNGと知っていますが、どのような順序で実行されていくのかが知りたいです。
実行結果は2となりますが、catchブロックはスキップされ、finallyのreturn 2;が実行されるという解釈で合っていますでしょうか。
また、仮にそうだとした場合、catchブロックでreturnすると抜けるので先にfinallyのreturnが実行された結果ということでしょうか。

0

2Answer

どのような順序で実行されていくのかが知りたいです。

実行の順序は、return 1が先で、その後にreturn 2です。

ご存知のとおり、finallyは、このtry-catchブロックを抜ける最後に必ず実行されます。

上のコードでは、try-catchブロックを抜けるきっかけを作ったのが、catchに書いたreturn 1です。

最終的に、この関数の戻り値は、最後に実行されたreturn 2で上書きしたような状態だと言えます。

2Like

Comments

  1. @aymnkt

    Questioner

    @nak435 さん、ありがとうございます。

IDE(Eclipse)等でブレークポイントを張って
ステップインで動かしていけば分かるかと思いますが、

throw new RuntimeException();

で例外が吐かれた時点で


} catch (RuntimeException e) {
    return 1;
}

が処理される為、
例外発生時は1がreturnされます。

が、その後、finally句必ず 実行される為(後述)、

} finally {
    return 2;
}

上記の処理結果として2がreturnされます。

その為、何処かで処理内容を確認しないと最終結果として

finallyのreturn 2;が実行される

というように見えるのかと思います。

結論としては

catchブロックはスキップされ、finallyのreturn 2;が実行されるという解釈(略)

上記は誤っていることになります。

finally句は例外発生有無関係なく必ず実行されます。

今回の例では恩恵を把握しづらいですが、
トランザクション中に例外が発生してもしなくても
最終的に終了する(確実に終了する)、
というような場合で使用する場面があるかと思います。

あくまで一例ですが
 ・DBアクセスを切断する
 ・ファイルへのアクセスを終了する
等々

0Like

Comments

  1. @aymnkt

    Questioner

    @syutorum001 さん、ありがとうございます。使用例は思いつきませんでした。参考になります、

Your answer might help someone💌