当前位置: 首页 > article >正文

try-with-resource

        try-with-resource是Java 7中引入的新特性,它可以方便地管理资源,自动关闭资源,从而避免了资源泄漏的问题。

作用 

        使用try-with-resource语句可以简化代码,避免了手动关闭资源的繁琐操作,同时还可以保证资源的正确关闭,避免了资源泄漏的问题。

语法结构

try (ResourceType resource = new ResourceType(args...)) {
    // 代码块
} catch (ExceptionType e) {
    // 异常处理
}

        在try关键字后面的括号中声明并初始化一个或多个资源。注意:【这些资源必须实现AutoCloseable接口,这个接口中只有一个方法close(),用于关闭资源】

 在代码块执行完毕之后,Java会自动调用这些资源的close()方法,释放资源。

示例

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

        在这个示例中,我们使用try-with-resource读取文件中的内容。try关键字后面的括号中声明了一个BufferedReader对象,它会自动关闭。在代码块中,我们使用readLine()方法读取文件的每一行,并打印出来。在catch块中捕获IOException异常,并输出错误信息。

底层

try-with-resources的语法形式类似于语法糖

编译器会将try-with-resources语句转换为普通的try-catch语句,并在finally块中自动调用资源的close()方法来关闭资源。

        try-with-resources的底层实现依赖于Java虚拟机的异常处理机制和字节码的异常表,通过自动调用资源的close()方法来确保资源被正确地关闭。

        1、Java编译器会将try块中的资源转换为一个虚拟的final变量,在try块结束时自动调用它们的close()方法来关闭资源。

        2、Java编译器为每个catch块生成一个异常处理器,并在字节码中的异常表中注册这些异常处理器。

        3、当try块中的代码执行时,如果发生异常,Java虚拟机会根据异常表中的信息查找匹配的异常处理器,并执行相应的操作。如果没有匹配的异常处理器,异常会被抛出到上一级调用者。

        4、当try块结束时,Java虚拟机会检查虚拟的final变量,并调用它们的close()方法。这个过程也会被包含在异常处理机制中,如果在关闭资源时发生异常,Java虚拟机会将这个异常封装到一个Suppressed异常中,并抛出到最终的异常处理器中。

注意:

AutoCloseable接口有个子接口——java.io.Closeableclose()方法不会抛出异常。


http://www.kler.cn/a/3497.html

相关文章:

  • Lsky-Pro在线图片搭建教程(Docker部署方式)
  • 攻防世界GFSJ1012 pwnstack
  • WebSocket实现私聊私信功能
  • Docker 部署 mysql
  • unity插件Excel转换Proto插件-ExcelToProtobufferTool
  • qml OpacityMask详解
  • mysql的limit查询竟然有坑?
  • C/C++中for语句循环用法及练习
  • 【机器学习面试总结】————特征工程
  • 蓝桥杯冲刺 - Lastweek - 你离省一仅剩一步之遥!!!(掌握【DP】冲刺国赛)
  • Python和Excel的完美结合:常用操作汇总(案例详析)
  • SIP协议及其简单介绍
  • 香橙派5使用NPU加速yolov5的实时视频推理(二)
  • 异或相关算法
  • [JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]
  • art 虚拟机相关
  • 不做孔乙己也不做骆驼祥子
  • ESP8266WiFi模块与Android APP实现数据传输(一)---硬件接线
  • 基于 PyTorch + LSTM 进行时间序列预测(附完整源码)
  • 在Linux下常见压缩文件的解压命令:
  • 面试官:rem和vw有什么区别
  • RTL8201 以太网PHY芯片 调试记录
  • 242. 一个简单的整数问题
  • 面试官:vue2和vue3的区别有哪些
  • PMP项目管理-【第一章】引论
  • 番茄学习法——亲测超级好用