面试官:`finally` 一定会执行吗?99% 的 Java 初学者都答错了!

面试官:`finally` 一定会执行吗?99% 的 Java 初学者都答错了!
很多人学习 Java 异常时都听过这样一句话finally一定会执行。这句话对吗答案是大多数情况下是对的但并不是绝对。今天就通过几个例子彻底搞懂finally的执行规则。一、什么是finallyfinally是异常处理机制中的一个代码块。它最大的特点是无论是否发生异常finally中的代码通常都会执行。例如try{System.out.println(try);}finally{System.out.println(finally);}输出try finally即使没有异常finally也会执行。二、发生异常finally会执行吗例如try{inta10/0;}catch(Exceptione){System.out.println(发生异常);}finally{System.out.println(finally);}输出发生异常 finally虽然程序发生了异常但finally依然会执行。这是因为finally的设计目的就是用于资源释放无论程序是否正常执行都应该完成清理工作。三、return会不会导致finally不执行不会。例如publicinttest(){try{return1;}finally{System.out.println(finally);}}输出finally最终返回1很多人误以为return会直接结束方法。实际上 JVM 会先执行finally再真正返回结果。执行顺序可以理解为执行 try ↓ 遇到 return ↓ 先执行 finally ↓ 最后返回结果四、什么时候finally不会执行虽然大多数情况下都会执行但下面几种特殊情况除外。1、调用System.exit()例如try{System.exit(0);}finally{System.out.println(finally);}输出没有任何输出原因是System.exit(0)会直接终止 JVM程序已经结束了finally自然没有机会执行。2、JVM 崩溃例如JVM 被强制关闭操作系统断电服务器突然宕机Java 进程被强制杀死如kill -9这些情况下程序已经无法继续运行finally也不会执行。五、finally一般用来做什么企业开发中finally最常见的用途就是释放资源。例如Connectionconnnull;try{conngetConnection();// 执行业务}finally{if(conn!null){conn.close();}}为什么放在finally因为无论SQL 是否执行成功是否抛出异常方法是否提前return数据库连接都必须关闭否则容易造成资源泄漏。当然在现代 Java 开发中更推荐使用try-with-resources自动关闭资源。六、面试如何回答如果面试官问finally一定会执行吗可以这样回答finally大多数情况下都会执行无论是否发生异常、是否进入catch甚至方法中执行了return都会先执行finally。但也存在特殊情况例如调用System.exit()直接终止 JVM或者 JVM 崩溃、进程被强制结束此时finally就不会执行。七、总结记住下面几点即可正常执行finally会执行。发生异常finally会执行。return之前仍然会先执行finally。System.exit()或 JVM 被强制终止时finally不会执行。一句话总结finally并不是百分之百会执行它会在绝大多数情况下执行但如果 JVM 已经结束运行它就没有执行的机会了。

最新新闻

日新闻

周新闻

月新闻