🍣

【Java】returnより先にfinallyが実行されるって知ってた?try-catch-finallyの動作を確認してみた

に公開

Javaで例外処理を書くときによく使うtry-catch-finally構文。
普段なんとなく使っているけれど、「return文を書いた位置によってfinallyがスキップされるのでは?」と疑問に思ったことはないでしょうか?

今回は、「returnfinallyの前にあっても、ちゃんとfinallyが実行されるのか?」という点を実験してみた結果をまとめます。


✅ 結論

finallyブロックは、trycatchの中で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を書くのは避けた方がよいです。


🔑 ポイントまとめ

  • trycatchの中にreturnがあっても、finallyは必ず実行される
  • 🔥 try内で例外が発生しても、catchfinallyの順で必ず通る
  • ⚠️ finally内にreturnがあると、その値が優先されて返される
  • 💡 finallyには、リソースの解放やログの記録など「必ず実行すべき処理」を書く

🧩 おわりに

普段何気なく使っているtry-catch-finallyですが、細かい動作を理解することで、より正確で安全なコードが書けるようになります。
特にfinallyの動きはバグの原因にもなりやすいため、意識して使っていきたいですね!

参考記事
https://www.tohoho-web.com/java/exception.htm
https://qiita.com/eijenson/items/7e9e112e69b37f72353c

Discussion