读《Effective Java》笔记 - 条目9

news/2024/11/27 13:31:43/

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

什么是 try-finally?

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

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 接口的资源

java">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 声明中用分号分隔声明。

java">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.ppmy.cn/news/1550359.html

相关文章

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时,需要使用浏览器进行调试,而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面,同时这个页面会调一些现有的接口时,就面临着跨域的问题。 解决…

Spring Boot中配置Flink的资源管理

在 Spring Boot 中配置 Flink 的资源管理&#xff0c;需要遵循以下步骤&#xff1a; 添加 Flink 依赖项 在你的 pom.xml 文件中&#xff0c;添加 Flink 和 Flink-connector-kafka 的依赖项。这里以 Flink 1.14 版本为例&#xff1a; <!-- Flink dependencies --><de…

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列&#xff0c;一般记为&#xff1a;sa1a2…an&#xff08;n≥0&#xff09;。其中&#xff0c;s是串的名称&#xff0c;用单括号括起来的字符序列是串的值&#xff1b;ai&#xff08;1≤i≤n&#xff09;可以是字母、数字或…

嵌入式linux系统中图像处理基本方法

目录 2.1 BMP图像处理 2.1.1 BMP文件格式解析 2.1.2 代码实现:将BMP文件解析为RGB格式,在LCD上显示 2.2 JPEG图像处理 2.2.1 JPEG文件格式和libjpeg编译 2.2.2 libjpeg接口函数的解析和使用 2.2.3 使用libjpeg把JPEG文件解析为RGB格式,在LCD上显示 …

数据结构初阶---复杂度

一、数据结构前言 1.数据结构与算法 数据结构(Data Structure)&#xff1a;是计算机组织、存储数据的一种方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm)&#xff1a;就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&am…

ECharts图表导出为svg文件

在 ECharts 中使用 SVG 渲染并保存为本地文件,可以通过以下步骤实现: 1. 设置 ECharts 使用 SVG 渲染 在 ECharts 的配置中,可以通过设置 renderer 为 ‘svg’ 来启用 SVG 渲染。 var chart = echarts.init(document.getElementById(main)