温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Finally最终 return 谁优先

发布时间:2026-11-10 07:51:40 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,finally 块的代码一定会执行(除非 JVM 退出,如 System.exit),但**“return 谁优先”要看具体情况**。


一、基本结论

✅ finally 块先执行,再真正 return

  • 如果 try 或 catch 中有 return
  • 那么:
    1. 先执行 return 后面的表达式求值
    2. 再执行 finally
    3. 最后才真正返回

二、常见情况分析

✅ 情况 1:finally 中没有 return

public static int test() {
    try {
        return 1;
    } finally {
        System.out.println("finally");
    }
}

执行顺序:

  1. return 1; → 计算返回值 = 1
  2. 执行 finally
  3. 方法返回 1

✅ 返回值是 try 中的 1


✅ 情况 2:finally 中也有 return(⚠️不推荐)

public static int test() {
    try {
        return 1;
    } finally {
        return 2;
    }
}

执行顺序:

  1. try 中 return 1 被“记下”
  2. finally 执行
  3. finally 中 return 2 覆盖
  4. 方法返回 2

⚠️ finally 的 return 会覆盖 try / catch 的 return


✅ 情况 3:finally 修改返回值变量(❗陷阱)

public static int test() {
    int a = 1;
    try {
        return a;
    } finally {
        a = 2;
    }
}

返回值是?

✅ 返回 1

原因:

  • return a; 时已经把 a 的值(1)拷贝到返回栈
  • finally 中改的是局部变量,不影响已确定的返回值

✅ 情况 4:返回的是对象(引用)

public static StringBuilder test() {
    StringBuilder sb = new StringBuilder("A");
    try {
        return sb;
    } finally {
        sb.append("B");
    }
}

返回的是?

✅ “AB”

原因:

  • 返回的是引用
  • finally 修改的是同一个对象

三、一句话总结

finally 一定执行,return 的值在 finally 前已确定;
如果 finally 里有 return,它会“覆盖”前面的 return。

✅ 规范建议:

  • ❌ 不要在 finally 中写 return
  • ✅ finally 只做资源释放(close、释放锁等)

如果你愿意,我可以给你画执行流程图或结合字节码讲原理。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手