finally 和 finalize() 有什么区别?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
finally 是 try 语句的一部分,用来在控制流离开 try/catch 时执行收尾逻辑;finalize() 是已弃用的对象终结方法,执行时机没有保证。前者属于程序控制流程,后者属于不可靠的旧式资源清理机制,两者没有调用上的关联。
讲清原理
正常完成、抛异常或执行 return 时,通常都会先执行关联的 finally,再完成原来的控制转移。但进程被强制结束、虚拟机退出等情况,不能承诺它一定执行。
finalize() 不会因为进入 finally 而调用,也不会在对象离开局部作用域时自动发生。Java 21 不建议再用它。对于实现 AutoCloseable 的资源,try-with-resources 通常比手写 finally 更稳妥,还能正确保存关闭过程中产生的被抑制异常。
例子与易错点
static int answer() {
try {
return 1;
} finally {
System.out.println("执行收尾");
}
}
answer() 会先打印再返回 1。不要在 finally 中另写 return,否则可能覆盖原返回值,甚至把原本应抛出的异常压住。
相关题:第 2 题、第 29 题、第 59 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。