找回密码
 立即注册
首页 业界区 安全 try-with-resources 详解

try-with-resources 详解

王平莹 昨天 02:35
try-with-resourcesJava 7 引入的语法糖,用于 自动 管理资源(如文件流、数据库连接等),确保资源在使用后被正确关闭,避免资源泄漏。
语法糖 是什么?语法糖 (Syntactic Sugar)是计算机语言中对语法进行的一些改动,使得代码更易于人类阅读和编写,但并不改变语言的功能或表达能力。本质上,编译器 / 解释器会在背后把这些 "甜语法" 转换成语言原本的基础语法来执行。
回到我们的 try-with-resources
基本语法
  1. try (ResourceType resource = new ResourceType()) {
  2.     // 使用资源的代码
  3. } catch (Exception e) {
  4.     // 异常处理
  5. }
复制代码
资源类 必须实现 AutoCloseable 或 Closeable 接口:
  1. public interface AutoCloseable {
  2.     void close() throws Exception;
  3. }
  4. public interface Closeable extends AutoCloseable {
  5.     void close() throws IOException;
  6. }
复制代码
传统 finally 方式(繁琐易出错):
  1. BufferedReader br = null;
  2. try {
  3.     br = new BufferedReader(new FileReader("test.txt"));
  4.     // 业务代码
  5. } catch (IOException e) {
  6.     e.printStackTrace();
  7. } finally {
  8.     // 必须判空 + 嵌套try-catch(close()也会抛异常)
  9.     if (br != null) {
  10.         try {
  11.             br.close();
  12.         } catch (IOException e) {
  13.             e.printStackTrace();
  14.         }
  15.     }
  16. }
复制代码
try-with-resources 方式(简洁健壮):
  1. try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
  2.     // 业务代码
  3. } catch (Exception e) {
  4.     e.printStackTrace();
  5. }
复制代码
单个资源
  1. try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
  2.     String line;
  3.     while ((line = br.readLine()) != null) {
  4.         System.out.println(line);
  5.     }
  6. } catch (IOException e) {
  7.     e.printStackTrace();
  8. }
复制代码
多个资源(支持在括号内声明多个资源,用;分隔):
  1. try (InputStream in = new FileInputStream("input.txt");
  2.      OutputStream out = new FileOutputStream("output.txt")) {
  3.    
  4.     byte[] buffer = new byte[1024];
  5.     int bytesRead;
  6.     while ((bytesRead = in.read(buffer)) != -1) {
  7.         out.write(buffer, 0, bytesRead);
  8.     }
  9. } catch (IOException e) {
  10.     e.printStackTrace();
  11. }
复制代码
资源顺序(多个资源按声明顺序关闭 - 后声明的先关闭):
  1. // 声明顺序:Connection → PreparedStatement → ResultSet
  2. try (Connection conn = DriverManager.getConnection(url, user, pwd);
  3.      PreparedStatement ps = conn.prepareStatement("SELECT * FROM user");
  4.      ResultSet rs = ps.executeQuery()) {
  5.     // 业务逻辑
  6. }
  7. // 关闭顺序:ResultSet → PreparedStatement → Connection
复制代码
try-with-resources 是 Java 开发中资源管理的首选方式,大大减少了资源泄漏的风险,提高了代码的可读性和可维护性。
痛苦本身也是生活。-- 烟沙九洲

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册