try-with-resources与finally块混用的执行逻辑及Scanner关闭问题
try-with-resources 与 finally 块的执行顺序分析
核心结论
- Scanner会被正常关闭:Scanner实现了
AutoCloseable接口,属于try-with-resources支持的资源类型,无论try块正常完成还是抛出异常,JVM都会自动调用其close()方法。 - finally块在资源关闭后执行:资源的关闭操作优先于finally块的代码逻辑。
结合示例代码的执行流程
示例代码如下:
try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } finally { System.out.println("finally"); }
执行步骤拆解:
- 初始化
Scanner对象,尝试打开目标文件test.txt。 - 执行try块内的循环逻辑,读取并打印文件内容。
- 若try块正常执行结束:
- JVM自动调用
scanner.close()关闭资源。 - 随后执行finally块中的打印语句。
- JVM自动调用
- 若文件不存在(触发
FileNotFoundException):- 进入catch块打印异常栈信息。
- 之后JVM自动调用
scanner.close()(如果Scanner对象已成功初始化的话)。 - 最后执行finally块的打印语句。
无论哪种场景,资源的关闭操作都先于finally块完成,且Scanner一定会被正确关闭。
内容的提问来源于stack exchange,提问作者Narendran Solai Sridharan
相关产品推荐
相关产品推荐

