温馨提示×

温馨提示×

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

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

java Finally最终执行顺序怎样

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

在 Java 中,finally 的执行顺序可以总结为一句话:

只要程序进入 try 块(无论是否异常),finally 块“几乎总是”在方法返回前执行,且在 return / throw 之前先执行。

下面按常见情况说明。


1️⃣ 正常情况(无异常)

public static void main(String[] args) {
    System.out.println(test());
}

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

执行顺序:

  1. try
  2. finally
  3. return 1

输出:

try
finally
1

✅ finally 在 return 之前执行


2️⃣ 发生异常,被 catch 捕获

try {
    System.out.println("try");
    int a = 1 / 0;
} catch (Exception e) {
    System.out.println("catch");
    return 2;
} finally {
    System.out.println("finally");
}

执行顺序:

  1. try
  2. catch
  3. finally
  4. return 2

✅ finally 在 catch 的 return 前执行


3️⃣ 异常未被捕获(方法抛出)

try {
    System.out.println("try");
    int a = 1 / 0;
} finally {
    System.out.println("finally");
}

执行顺序:

  1. try
  2. finally
  3. 向上抛出异常

4️⃣ finally 中也有 return(⚠️不推荐)

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

结果:

  • 方法返回 2
  • try 中的 return 1 被覆盖

⚠️ finally 中的 return 会覆盖 try / catch 的返回值


5️⃣ finally 中修改返回值变量(⚠️陷阱)

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

返回结果仍是 1

原因:

  • return x 在 finally 前已“复制”返回值
  • finally 修改的是局部变量,不影响已确定的返回值

6️⃣ finally 不执行的极端情况 ❌

以下情况 finally 不会执行:

  • System.exit(0)
  • JVM 崩溃
  • 死机 / 断电
  • 线程被强制 kill(如 Runtime.halt())

✅ 总结口诀

try 先走,finally 后收,return 在前,finally 在先

或更正式一点:

  • try / catch 中遇到 return 或 throw
  • 先执行 finally
  • 再真正返回或抛异常
  • finally 的 return 优先级最高(但不推荐)

如果你愿意,我也可以用 字节码层面 或 面试陷阱题 来帮你更深入理解。

向AI问一下细节

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

AI
助
手