🍣
【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