🍣
【Java】returnより先にfinallyが実行されるって知ってた?try-catch-finallyの動作を確認してみた
Javaで例外処理を書くときによく使うtry-catch-finally
構文。
普段なんとなく使っているけれど、「return文を書いた位置によってfinallyがスキップされるのでは?」と疑問に思ったことはないでしょうか?
今回は、「return
がfinally
の前にあっても、ちゃんとfinally
が実行されるのか?」という点を実験してみた結果をまとめます。
✅ 結論
finally
ブロックは、try
やcatch
の中でreturn
を書いたとしても、必ず実行されます。
つまり、return
の前にfinally
があっても、finally
の処理が終わったあとにreturn
されるという挙動になります。
💻 パターン①:try内でreturnした場合
public class FinallyTest {
public static void main(String[] args) {
System.out.println("Result: " + testMethod());
}
public static String testMethod() {
try {
System.out.println("Try block");
return "Returned from try";
} catch (Exception e) {
System.out.println("Catch block");
return "Returned from catch";
} finally {
System.out.println("Finally block");
}
}
}
実行結果
Try block
Finally block
Result: Returned from try
try
ブロックでreturn
していますが、その前にfinally
ブロックが実行されていることが確認できます。
💥 パターン②:try内で例外をthrowした場合
public class Main {
public static void main(String[] args) {
System.out.println("Result: " + testMethod());
}
public static String testMethod() {
try {
System.out.println("Try block");
throw new Exception("Exception occurred");
} catch (Exception e) {
System.out.println("Catch block");
return "Returned from catch";
} finally {
System.out.println("Finally block");
}
}
}
実行結果
Try block
Catch block
Finally block
Result: Returned from catch
この場合は、try
内で例外がスローされ、catch
に処理が移ってreturn
。
しかしこのときも、return
の前にfinally
ブロックが確実に実行されていることが分かります。
⚠️ パターン③:finally内でreturnした場合
public class FinallyMain {
public static void main(String[] args) {
System.out.println("Result: " + testMethod());
}
public static String testMethod() {
try {
return "Returned from try";
} finally {
return "Returned from finally";
}
}
}
実行結果
Result: Returned from finally
このように、finally
の中にreturn
を書くと、そちらが優先されて最終的な戻り値になります。
ただこれはよくない書き方なので、基本的にfinally
内でreturn
を書くのは避けた方がよいです。
🔑 ポイントまとめ
- ✅
try
やcatch
の中にreturn
があっても、finally
は必ず実行される - 🔥
try
内で例外が発生しても、catch
→finally
の順で必ず通る - ⚠️
finally
内にreturn
があると、その値が優先されて返される - 💡
finally
には、リソースの解放やログの記録など「必ず実行すべき処理」を書く
🧩 おわりに
普段何気なく使っているtry-catch-finally
ですが、細かい動作を理解することで、より正確で安全なコードが書けるようになります。
特にfinally
の動きはバグの原因にもなりやすいため、意識して使っていきたいですね!
参考記事
Discussion