登录
首页 >  文章 >  java教程

return和finally执行顺序解析

时间:2026-01-13 18:54:43 423浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《return和finally谁先执行?Java控制流程详解》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

return表达式先计算并暂存结果,finally执行完后才真正返回;若finally含return或抛异常,则覆盖原返回值;修改引用对象状态会影响返回结果。

Java里return和finally谁先执行_Java控制流程细节说明

在Java中,return语句会先触发执行,但方法的实际返回值是在finally块执行完毕后才确定的。关键在于:return表达式会先计算并暂存结果,然后控制权移交到finally块;finally执行完后,再把之前暂存的结果真正返回。

return表达式先求值,但不立即返回

当代码执行到return语句时,JVM会做三件事:

  • 计算return后面的表达式(比如return getValue() + 1中的getValue() + 1
  • 将计算结果保存在一个临时位置(如局部变量表或操作数栈)
  • 标记该方法即将退出,但暂停返回动作,转去执行finally块

这意味着即使finally里修改了相关变量,也不会影响已暂存的返回值——除非finally里也有return或抛出异常。

finally中有return会覆盖原返回值

如果finally块中包含return语句,它会直接终结方法执行,并以它的return值为准,原return的暂存结果被丢弃。

例如:

public static int test() {
    try {
        return 1;
    } finally {
        return 2; // 这个return生效,最终返回2
    }
}

这种写法虽然合法,但容易引发逻辑混淆,应避免。

finally中抛出异常会中断正常返回

如果finally块执行过程中抛出异常(包括return语句隐式抛出的异常),那么try或catch中已准备好的返回值会被丢弃,调用方收到的是finally抛出的异常。

例如:

public static int test() {
    try {
        return 1;
    } finally {
        throw new RuntimeException("in finally"); // 方法直接抛异常,不返回1
    }
}

此时调用test()会抛出RuntimeException,而不是返回1。

finally中修改对象状态不影响已暂存的基本类型返回值

对于基本类型(int、boolean等),return暂存的是值本身,finally中改同名变量无效;但对于引用类型,若return的是对象引用,而finally中修改了该对象的字段,则调用方看到的是修改后的对象状态。

例如:

public static StringBuilder test() {
    StringBuilder sb = new StringBuilder("a");
    try {
        return sb; // 返回sb的引用
    } finally {
        sb.append("b"); // 修改对象内容
    }
}

调用方拿到的StringBuilder内容是"ab",因为引用指向的对象被改变了。

理论要掌握,实操不能落!以上关于《return和finally执行顺序解析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>