You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"); 
}

执行步骤拆解:

  1. 初始化Scanner对象,尝试打开目标文件test.txt。
  2. 执行try块内的循环逻辑,读取并打印文件内容。
  3. 若try块正常执行结束:
    • JVM自动调用scanner.close()关闭资源。
    • 随后执行finally块中的打印语句。
  4. 若文件不存在(触发FileNotFoundException):
    • 进入catch块打印异常栈信息。
    • 之后JVM自动调用scanner.close()(如果Scanner对象已成功初始化的话)。
    • 最后执行finally块的打印语句。

无论哪种场景,资源的关闭操作都先于finally块完成,且Scanner一定会被正确关闭。

内容的提问来源于stack exchange,提问作者Narendran Solai Sridharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:57:32