在 Java 中,finally 是异常处理机制的一部分,核心作用是无论 try 块是否抛出异常、是否被 catch 捕获、是否有 return,finally 中的代码几乎总会被执行(除非 JVM 退出或系统崩溃)。
下面从适用场景、典型用法和注意事项三个角度说明。
用于关闭必须释放的资源,防止资源泄漏。
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
// 读取文件
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅ 适用于:
注:Java 7+ 推荐使用
try-with-resources,但finally仍常见于老代码或复杂逻辑。
在并发编程中,保证锁一定被释放。
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}
✅ 防止死锁的关键写法
用于恢复被修改的全局或共享状态。
boolean oldFlag = flag;
flag = true;
try {
// 业务逻辑
} finally {
flag = oldFlag;
}
确保方法退出前一定记录日志。
try {
process();
} finally {
log.info("process finished");
}
finally 在 return 前执行。
public int test() {
try {
return 1;
} finally {
System.out.println("finally");
}
}
输出:
finally
会覆盖 try / catch 中的 return
try {
return 1;
} finally {
return 2; // 最终返回 2
}
⚠️ 极不推荐
会掩盖 try / catch 中的异常
try {
throw new RuntimeException("A");
} finally {
throw new RuntimeException("B");
}
最终只看到 B
如数据库事务提交,应在 try 中控制,finally 只做回滚/关闭
System.exit()Finally 适用于“无论成功失败都必须执行的清理动作”,尤其是资源释放、锁释放和状态恢复。
如果你愿意,我也可以对比 finally vs try-with-resources 或结合面试常见问题来讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。