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

读《Effective Java》笔记 - 条目9

条目9:与try-finally 相比,首选 try -with -resource

什么是 try-finally?

try-finally 是 Java 中传统的资源管理方式,通常用于确保资源(如文件流、数据库连接等)被正确关闭。

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

缺点:

  • 代码繁琐:需要在 finally 中显式关闭资源。
  • 容易出错:如果忘记在 finally 中关闭资源,可能导致资源泄漏。
  • 嵌套复杂:当多个资源需要管理时,代码变得更加难以阅读和维护。
  • 异常掩盖问题:如果关闭资源时发生异常,会覆盖原始异常,导致问题难以排查。

什么是 try-with-resources?

try-with-resources 是 Java 7 引入的语法糖,旨在简化资源管理。其核心思想是:自动关闭实现了 AutoCloseable 接口的资源

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

工作原理

  • 只需在 try 声明中定义资源。

  • try 块结束后,Java 会自动调用资源的 close() 方法。

  • 如果多个资源需要管理,可以在 try 声明中用分号分隔声明。

try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"));FileWriter writer = new FileWriter("output.txt")
) {writer.write(reader.readLine());
} catch (IOException e) {e.printStackTrace();
}

优点:

  • 代码更简洁,减少了显示关闭资源的代码,使代码更加直观,更易读
  • 自动资源管理,只要实现了AutoCloseable 接口的类(包括 Closeable 的子类)都支持自动关闭。
  • 更安全避免资源泄漏:即使 try 块中发生异常,资源也能被正确关闭。避免异常掩盖:如果关闭资源时发生异常,Java 会将其与主异常一并记录,而不会直接覆盖主异常。
  • 多资源管理时,try-with-resources 的嵌套深度远低于 try-finally
http://www.lryc.cn/news/492210.html

相关文章:

  • 【软件入门】Git快速入门
  • nextjs window is not defined
  • C语言实现冒泡排序:从基础到优化全解析
  • windows11下git与 openssl要注意的问题
  • lua除法bug
  • Ubuntu下Docker容器java服务往mysql插入中文数据乱码
  • C语言根据字符串变量获取/设置结构体成员值
  • Selenium 自动化测试demo
  • LeetCode 111.二叉树的最小深度
  • 大工C语言作业答案
  • 【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
  • QT 跨平台实现 SSDP通信 支持多网卡
  • 如何寻找适合的HTTP代理IP资源?
  • 数据结构(ArrayList顺序表)
  • 直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
  • RK3588-LinuxSDK安装
  • MATLAB 中有关figure图表绘制函数设计(论文中常用)
  • Unity UGUI原理剖析
  • Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
  • 架构-微服务-服务网关
  • 基于springboot的HttpClient、OKhttp、RestTemplate对比
  • (计算机组成原理)期末复习
  • 从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
  • 【Java从入门到放弃 之 Java程序基础】
  • 2024年11月26日Github流行趋势
  • 相亲交友小程序项目介绍
  • 使用ENSP实现默认路由
  • CSGO游戏搬砖党如何应对上海Major
  • 【人工智能】AutoML自动化机器学习模型构建与优化:使用Auto-sklearn与TPOT的实战指南
  • go-zero(八) 中间件的使用