首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用try-with-resource需要注意的地方

使用try-with-resource需要注意的地方

作者头像
johnhuster的分享
发布于 2022-03-28 12:19:29
发布于 2022-03-28 12:19:29
52400
代码可运行
举报
文章被收录于专栏:johnhusterjohnhuster
运行总次数:0
代码可运行

try-with-resource是JDK7引入的语法糖,可以简化Autocloseable资源类的关闭过程,比如JDK7以前下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		File file = new File("d:/tmp/1.txt");
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			xxxxx
            xxxxx
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(fis != null){
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

上面是一段读取文件内容的示意代码,为了防止在try代码块中出现异常后导致的资源泄露问题,在finally代码块中一般处理资源的关闭事项,JDK之后上面的代码就可以简化成下面的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		File file = new File("d:/tmp/1.txt");
		try(FileInputStream fis = new FileInputStream(file);) {
			fis.read();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
		}

可以看出是简化了不少,之所以称之为语法糖,是因为编译成class文件后实际的代码就不是这样的了,编译过程中会自动添加资源的关闭处理,上面的代码编译出的class文件使用javap进行反编译后是下面这样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		File file = new File("d:/tmp/1.txt");

		try {
			Throwable var2 = null;
			Object var3 = null;

			try {
				FileInputStream fis = new FileInputStream(file);
                xxx
                xxxx
			} catch (Throwable var12) {
				if (var2 == null) {
					var2 = var12;
				} else if (var2 != var12) {
					var2.addSuppressed(var12);
				}

				throw var2;
			}
		} catch (IOException var13) {
			var13.printStackTrace();
		}

好了,上面已经引入今天的主题,try-with-resource,但是仍然有需要注意的地方,比如下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	private static class MyResource implements AutoCloseable{

		private MyResource1 res;
		
		public MyResource(MyResource1 res){
			this.res = res;
		}
		
		@Override
		public void close() throws Exception {
			System.out.println("MyResource自动关闭");
			Integer a = null;
			a.toString();
			this.res.close();
		}
	}
	
	private static class MyResource1 implements AutoCloseable{

		@Override
		public void close() throws Exception {
			System.out.println("MyResource1自动关闭");
		}
	}
	
	
	@Test
	public void test() throws Exception{
		try(
				MyResource r = new MyResource(new MyResource1())){
			Integer a = null ;
			a.toString();
		}
	}

执行上面的代码,由于MyResource的close方法中出现了异常,此时创建的MyResource1就不会被关闭,从而出现资源泄露情况,为了规避这个问题,为了规避这个问题,我们需要创建的实现AutoCloseable接口的对象单独创建,如下面所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		try(
				MyResource1 res= new MyResource1();
				MyResource r = new MyResource(res)){
			Integer a = null ;
			a.toString();
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你还在使用 try-catch-finally 关闭资源?
作者:何甜甜在吗 链接:https://juejin.im/post/5b8f9fa05188255c6f1df755
Java技术栈
2020/07/03
9100
与面试官聊try-catch-finally关闭资源,你的答案还是10年前的?
有编程经验的朋友都知道,在程序运行中如果打开了一些资源,那么当发生异常或程序结束时都需要进行资源的关闭,不然会造成内存溢出的问题。
程序新视界
2021/12/07
7210
try 语句如何更优雅的关闭资源?请看这里!
try-with-resources是 JDK 7 中引入的一个新的异常处理机制,它能让开发人员不用显式的释放try-catch语句块中使用的资源。
Java极客技术
2022/12/04
4450
Java7的try-with-resources声明(转)
看《Effective Java》第三版的时候,看到了其中建议将try-finally替换为try-with-resources。这个语法糖还算有意思,特此成文。
会说话的丶猫
2020/08/25
5810
瞧瞧别人家的异常处理,那叫一个优雅
在我们日常工作中,经常会遇到一些异常,比如:NullPointerException、NumberFormatException、ClassCastException等等。
苏三说技术
2024/10/25
2010
瞧瞧别人家的异常处理,那叫一个优雅
哇塞!try-with-resouces 真神奇!
“二哥,终于等到你讲 try-with-resouces 了!”三妹夸张的表情让我有些吃惊。
沉默王二
2021/07/16
3830
JDK9新特性实战:简化流关闭新姿势。
做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能。 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化。 JDK6 在JDK6及之前,每个资源都需要我们手动写代码关闭,如: FileInputStream fis = null; byte[] buffer = new byte[1024]; try { fis = new FileInputStream(new File("E:\\Java技术栈.txt"));
Java技术栈
2018/04/02
7970
JDK9新特性实战:简化流关闭新姿势。
Java异常体系中的秘密
相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很小,但对代码性能、可读性有着较为重要的作用
大闲人柴毛毛
2018/03/29
1.1K0
Java异常体系中的秘密
你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
开发中,我们常常需要在最后进行一些资源的关闭。比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭。但是这种写法是很不简洁的。其实,早在JDK1.7就已经引入了try-with-resources来关闭资源的方式,我们今天就来体验一下try-with-resources的简洁之处。
Happyjava
2019/07/16
1.5K0
你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
我去,你竟然还在用 try–catch-finally
这是读者 Alice 上周特意给我发来的信息,真令我动容。的确,上次的“我去”阅读量杠杠的,几个大号都转载了,包括 CSDN,次条当天都 1.5 万阅读。但比如“还以为你有什么新特技,没想到用的是 Java 13”这类批评的声音也不在少数。
沉默王二
2020/04/07
1.3K0
我去,你竟然还在用 try–catch-finally
不会吧,还有人在 finally 里关闭资源?
身为 Java 大神的各位肯定避免不了使用各式各样需要关闭的 Stream 或 Client 吧。例如 FileInputStream、HTTPClient 之类的。那么大家肯定会遇到以下恶心的代码
Java程序猿阿谷
2020/11/12
6110
不会吧,还有人在 finally 里关闭资源?
IO系列学习
注意1: 需要在D:\LOLFolder确实存在一个LOL.exe,才可以看到对应的文件长度、修改时间等信息 注意2: renameTo方法用于对物理文件名称进行修改,但是并不会修改File对象的name属性
默 语
2024/11/20
810
IO系列学习
Java学习【IO流:深入理解与应用(上)】
在Java编程中,IO(Input/Output)流是一个非常重要的概念,它允许我们与各种数据源(如文件、网络、内存等)进行交互。Java的IO库提供了丰富的类和方法,用于读取和写入数据。
2的n次方
2024/10/15
1350
Java学习【IO流:深入理解与应用(上)】
【愚公系列】2023年10月 Java教学课程 062-资源释放的方式
在编程中,资源释放指的是在程序中手动或自动释放不再需要的系统资源,例如内存、文件句柄、网络连接等。正确的资源释放可以避免内存泄漏和其他资源浪费问题,提高程序的性能和稳定性。
愚公搬代码
2025/05/28
1290
try-with-resource如何优雅的关闭io流[通俗易懂]
JAVA的一大特性就是JVM会对内部资源实现自动回收,即自动GC,给开发者带来了极大的便利。但是JVM对外部资源的引用却无法自动回收,例如数据库连接,网络连接以及输入输出IO流等,这些连接就需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占用等。
全栈程序员站长
2022/11/07
7360
技术转载——Java 异常处理的十个建议
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
用户5546570
2020/06/18
5970
技术转载——Java 异常处理的十个建议
你会使用try-with-resources吗
比如 InputStream、OutputStream,数据库连接对象 Connection,MyBatis中的 SqlSession 会话等。作为开发人员经常会忽略掉资源的关闭方法,导致内存泄漏。
cxuan
2019/09/11
1.5K0
java try with resources方式关闭资源
附: 资源一般是指:实现了Closeable接口或者AutoCloseable接口,这种资源使用完毕后都需要关闭。
IT云清
2019/01/22
8470
Java大学问——优雅地处理异常
你有没有这样的印象,当你想要更新一款 APP 的时候,它的更新日志里总有这么一两句描述:
本人秃顶程序员
2019/05/05
6270
Java大学问——优雅地处理异常
Java中 IO流异常处理的方式
处理Java中的I/O流异常至关重要。通过使用try-catch块、throws关键字、try-with-resources语句以及自定义异常类,可以有效地捕获和处理I/O操作可能引发的异常。这样可以增强程序的健壮性,确保在面对外部资源交互问题时,程序能够以可控的方式继续执行,避免系统崩溃或数据丢失的风险。
猫头虎
2024/04/07
3180
相关推荐
你还在使用 try-catch-finally 关闭资源?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验