try-catch-finally句内の実行順序とreturnについて

try-catch-finally句とは

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

例外が発生しそうな処理をtryブロック、例外時の処理をcatchブロック、例外の有無に問わず必ず実行する処理をfinallyブロックで囲い込むことです。

try-catch-finally句内の実行順序とreturn

例外が発生しない 且つ try-catch-finally句の中で、returnをする場合

サンプルA

実行結果

try句の処理を実行したあとにfinally句の処理が実行されています。

finally句でreturnは実行されますが、try句のreturnは実行されません。

例外が発生した 且つ try-catch-finally句の中で、returnをする場合

サンプルB

実行結果

catch句の処理を実行したあとにfinally句の処理が実行されています。

finally句でreturnは実行されますが、catch句のreturnは実行されません。

例外が発生した 且つ try-catch-finally句の中で、returnをする場合

サンプルC

実行結果

finally句で変数strの値を変更していますがreturnがないので、戻り値は上書きされることはなく、catch句の設定値のままです。

戻り値がインスタンスの場合

サンプルD

実行結果

finally句でnameの値が変更されていましたstuがreturnされています。

まとめ

  • finally句の処理が例外の有無に問わず、returnする前に必ず実行されます。
  • finally句でreturnがある場合、優先で実行されます。
  • finally句でreturnがない場合、戻り値の値がfinally句を実行する前にお決まりです。
    つまり、finally句で変数の値を変更しても、戻り値は変わりません。
    但し、インスタンス変数の変更なら、戻り値は変わります。
  • finallyブロック内で値の変更処理やreturn処理を記載しますと、他人が理解しにくいため、お勧めしません。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス