温馨提示×

温馨提示×

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

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

java Finally最终能跳过吗

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

在 Java 中,finally 块“几乎总是会执行”,但确实有少数特殊情况可以跳过 finally,而且不能靠正常流程跳过。

下面分情况说明:


一、正常情况下:finally 一定会执行

只要 try 块开始执行,finally 就会执行(无论是否异常、return、break、continue)。

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

✅ 输出 finally 后,方法才返回。


二、可以“跳过 finally”的几种特殊情况(非正常情况)

1️⃣ JVM 退出(System.exit())

try {
    System.exit(0);
} finally {
    System.out.println("finally");
}

❌ finally 不会执行

原因:System.exit() 直接终止 JVM。


2️⃣ 操作系统强制结束

  • kill -9
  • 断电
  • 机器崩溃
  • 进程被强制杀掉

❌ finally 不会执行


3️⃣ 守护线程(Daemon Thread)被 JVM 强制结束

Thread t = new Thread(() -> {
    try {
        while (true) {}
    } finally {
        System.out.println("finally");
    }
});
t.setDaemon(true);
t.start();

当 JVM 退出时,守护线程可能直接被杀,finally 不保证执行。


4️⃣ 线程被 stop()(已废弃,极危险)

thread.stop();

❌ 可能直接跳过 finally

⚠️ 不推荐使用


三、finally 一定会执行,但返回值可能被“覆盖”

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

✅ 返回 2
⚠️ 非常不推荐这样写


四、总结一句话

Java 中 finally 不能被“正常跳过”,只有 JVM 退出或线程被强制终止时才会不执行。

✅ 一定会执行:

  • return / throw / break / continue
  • 异常发生或未发生

❌ 不会执行:

  • System.exit()
  • JVM 崩溃
  • 进程被杀
  • 守护线程被强制结束

如果你愿意,我也可以帮你分析某个具体代码场景是否会执行 finally。

向AI问一下细节

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

AI
助
手