Java中try-with-resources的使用详解

 更新时间:2026年01月21日 09:46:51   作者:烟沙九洲  
try-with-resources 是 Java 开发中资源管理的首选方式,大大减少了资源泄漏的风险,提高了代码的可读性和可维护性,下面就来详细的介绍一下,感兴趣的可以了解一下

try-with-resourcesJava 7 引入的语法糖,用于 自动 管理资源(如文件流、数据库连接等),确保资源在使用后被正确关闭,避免资源泄漏。

语法糖 是什么?语法糖 (Syntactic Sugar)是计算机语言中对语法进行的一些改动,使得代码更易于人类阅读和编写,但并不改变语言的功能或表达能力。本质上,编译器 / 解释器会在背后把这些 "甜语法" 转换成语言原本的基础语法来执行。

回到我们的 try-with-resources

基本语法

try (ResourceType resource = new ResourceType()) {
    // 使用资源的代码
} catch (Exception e) {
    // 异常处理
}

资源类 必须实现 AutoCloseable 或 Closeable 接口:

public interface AutoCloseable {
    void close() throws Exception;
}

public interface Closeable extends AutoCloseable {
    void close() throws IOException;
}

传统 finally 方式(繁琐易出错):

BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("test.txt"));
    // 业务代码
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 必须判空 + 嵌套try-catch(close()也会抛异常)
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

try-with-resources 方式(简洁健壮):

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    // 业务代码
} catch (Exception e) {
    e.printStackTrace();
}

单个资源

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

多个资源(支持在括号内声明多个资源,用;分隔):

try (InputStream in = new FileInputStream("input.txt");
     OutputStream out = new FileOutputStream("output.txt")) {
    
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}

资源顺序(多个资源按声明顺序关闭 - 后声明的先关闭):

// 声明顺序:Connection → PreparedStatement → ResultSet
try (Connection conn = DriverManager.getConnection(url, user, pwd);
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM user");
     ResultSet rs = ps.executeQuery()) {
    // 业务逻辑
}
// 关闭顺序:ResultSet → PreparedStatement → Connection

try-with-resources 是 Java 开发中资源管理的首选方式,大大减少了资源泄漏的风险,提高了代码的可读性和可维护性。

到此这篇关于Java中try-with-resources的使用详解的文章就介绍到这了,更多相关Java try-with-resources内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot多环境日志配置方式

    SpringBoot多环境日志配置方式

    SpringBoot 默认使用LogBack日志系统,默认情况下,SpringBoot项目的日志只会在控制台输入,本文给大家介绍SpringBoot多环境日志配置方式,需要的朋友可以参考下
    2024-08-08
  • Debian 7 和 Debian 8 用户安装 Java 8的方法

    Debian 7 和 Debian 8 用户安装 Java 8的方法

    Oracle Java 8 稳定版本近期已发布,有很多新的特征变化。其中,有功能的程序支持通过“Lambda项目 ”,收到了一些安全更新和界面改进上的bug修复,使得开发人员的工作更容易。
    2014-03-03
  • Java BigDecimal基础用法详解

    Java BigDecimal基础用法详解

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理
    2022-06-06
  • Java如何导入Jsoup库做一个有趣的爬虫项目

    Java如何导入Jsoup库做一个有趣的爬虫项目

    Jsoup库是一款Java的HTML解析器,可用于从网络或本地文件中获取HTML文档并解析其中的数据,这篇文章给大家介绍Java导入Jsoup库做一个有趣的爬虫项目,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • SpringBoot项目启动时增加自定义Banner的简单方法

    SpringBoot项目启动时增加自定义Banner的简单方法

    最近看到springboot可以自定义启动时的banner,然后自己试了一下,下面这篇文章主要给大家介绍了SpringBoot项目启动时增加自定义Banner的简单方法,需要的朋友可以参考下
    2022-01-01
  • Java并发编程信号量Semapher

    Java并发编程信号量Semapher

    这篇文章主要介绍了Java并发编程信号量Semapher,Semapher信号量也是Java中的一个同步器,下文关于信号量Semapher的更多内容介绍,需要的小伙伴可以参考下面文章
    2022-04-04
  • spring cloud gateway如何获取请求的真实地址

    spring cloud gateway如何获取请求的真实地址

    这篇文章主要介绍了spring cloud gateway如何获取请求的真实地址问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • JAVA流控及超流控后的延迟处理实例

    JAVA流控及超流控后的延迟处理实例

    这篇文章主要介绍了JAVA流控及超流控后的延迟处理,以实例形式较为详细的分析了Java进行流量控制的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Java数组的定义、初始化、及二维数组用法分析

    Java数组的定义、初始化、及二维数组用法分析

    这篇文章主要介绍了Java数组的定义、初始化、及二维数组用法,结合具体实例形式分析了java数组概念、功能、数组定义、静态数组、动态数组、二维数组等相关使用技巧,需要的朋友可以参考下
    2019-01-01
  • 浅谈Java包装类型Long的==操作引发的低级bug

    浅谈Java包装类型Long的==操作引发的低级bug

    本文主要介绍了浅谈Java包装类型Long的==操作引发的低级bug,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论