在 Java 中,finally 的执行顺序可以总结为一句话:
只要程序进入 try 块(无论是否异常),finally 块“几乎总是”在方法返回前执行,且在 return / throw 之前先执行。
下面按常见情况说明。
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");
}
}
执行顺序:
tryfinallyreturn 1输出:
try
finally
1
✅ finally 在 return 之前执行
try {
System.out.println("try");
int a = 1 / 0;
} catch (Exception e) {
System.out.println("catch");
return 2;
} finally {
System.out.println("finally");
}
执行顺序:
trycatchfinallyreturn 2✅ finally 在 catch 的 return 前执行
try {
System.out.println("try");
int a = 1 / 0;
} finally {
System.out.println("finally");
}
执行顺序:
tryfinallystatic int test() {
try {
return 1;
} finally {
return 2;
}
}
结果:
2try 中的 return 1 被覆盖⚠️ finally 中的 return 会覆盖 try / catch 的返回值
static int test() {
int x = 1;
try {
return x;
} finally {
x = 2;
}
}
返回结果仍是 1
原因:
return x 在 finally 前已“复制”返回值以下情况 finally 不会执行:
System.exit(0)Runtime.halt())try 先走,finally 后收,return 在前,finally 在先
或更正式一点:
try / catch 中遇到 return 或 throwfinallyfinally 的 return 优先级最高(但不推荐)如果你愿意,我也可以用 字节码层面 或 面试陷阱题 来帮你更深入理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。