在 Java 中,finally 块本身不一定会报错,但在 finally 中写的代码有可能抛异常,而且某些情况下 finally 的行为会影响异常的传播。
下面分几种常见情况说明:
finally 不会“报错”try {
System.out.println("try");
} finally {
System.out.println("finally");
}
✅ 不会报错
✅ finally 一定会执行(除非 JVM 退出)
finally 里抛异常 → 会报错try {
System.out.println("try");
} finally {
throw new RuntimeException("finally error");
}
❌ 会报错
⚠️ finally 中的异常会“覆盖” try 中的异常
如果 try 也有异常:
try {
throw new Exception("try error");
} finally {
throw new RuntimeException("finally error");
}
✅ 最终抛出的是 finally error
❌ try error 被“吞掉”(很难排查)
finally 中 return → 不会抛原异常try {
throw new Exception("try error");
} finally {
return;
}
❌ 原异常不会抛出
✅ 方法直接返回
⚠️ 不推荐在 finally 中写 return
finally 一定执行吗?✅ 一般都会执行
❌ 以下情况不会:
System.exit(0)try {
System.exit(0);
} finally {
System.out.println("不会执行");
}
try {
// 业务代码
} catch (Exception e) {
// 处理异常
} finally {
// 只做资源释放,不要抛异常
}
如果 finally 必须可能出错:
finally {
try {
closeResource();
} catch (Exception e) {
// 记录日志
}
}
finally本身不会“必然报错”,但写不好会让程序异常丢失或行为异常。
如果你有具体代码场景(比如 Spring、IO、线程),我可以帮你分析是否会出问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。