在 Java 中,finally 块通常用于保证一段代码“无论如何都会执行”,但“最终何时执行”取决于具体场景。下面系统地说明。
try-catch-finally 正常流程try {
// 可能抛异常
} catch (Exception e) {
// 处理异常
} finally {
// 一定执行
}
执行顺序:
trycatchfinally✅ 即使 try 或 catch 中有 return,finally 也会先执行。
finally 在 return 之前的执行时机(重点)try 中 returnpublic static int test() {
try {
return 1;
} finally {
System.out.println("finally");
}
}
执行顺序:
return 1finally输出:
finally
finally 中修改返回值(坑点)public static int test() {
int x = 1;
try {
return x;
} finally {
x = 2;
}
}
✅ 返回值是 1,不是 2
原因:return x 已经把值“拷贝”了
finally 不执行的情况(重要)以下情况 finally 不会执行:
System.exit()try {
System.exit(0);
} finally {
System.out.println("不会执行");
}
kill -9Thread t = new Thread(() -> {
try {
while (true);
} finally {
System.out.println("可能不会执行");
}
});
t.setDaemon(true);
t.start();
finally 与异常的关系finally 本身抛异常try {
throw new RuntimeException("try");
} finally {
throw new RuntimeException("finally");
}
✅ finally 的异常会覆盖 try 的异常
try-with-resources 中的 finallytry (InputStream in = new FileInputStream("a.txt")) {
// 自动关闭
} finally {
// 仍会执行
}
✅ finally 在资源关闭之后执行
finally在方法返回前、异常抛出前执行,除非 JVM 退出或线程被强制终止。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。