文档章节

jdk1.7中try-with-resources语法糖详解

拉风小野驴
 拉风小野驴
发布于 2016/03/23 16:28
字数 608
阅读 453
收藏 0

首先回忆一下jdk1.7之前,我们要通过流读取文件时,代码要怎样写?

假设本地文件系统d盘下有一个in.txt文件,代码如下:

FileInputStream in = null;
		try {
			in = new FileInputStream("d:/in.txt");
		} catch(Exception e) {
			System.out.println(e.getMessage());
			throw new RuntimeException("try块中产生了异常",e);
		} finally {
			if (in != null)
				in.close();
		}

此时试想一个问题:如果try块中new FileInputStream抛出了异常,在finally块中调用close方法时也抛出了异常,那么最终抛给上层的究竟是哪个异常?

答案是:抛给上层的是close方法产生的异常。

但是很明显,我们希望的是把catch块中捕获的异常进行处理后,继续向上抛出,可结果却因为close方法产生异常而丢失了我们预期的异常。

针对此问题,解决方案是:调用in.close()时再次使用try-catch块包裹,代码如下:

FileInputStream in = null;
		try {
			in = new FileInputStream("d:/in.txt");
		} catch(Exception e) {
			System.out.println(e.getMessage());
			throw new RuntimeException("try块中产生了异常",e);
		} finally {
			if (in != null)
				try {
					in.close();
				}catch(IOException e) {
					e.printStackTrace();
				}
		}

至此,问题已经得到完美解决。但是,每次处理IO问题时都要编码重复且复杂的代码是不是很繁琐?于是,jdk1.7推出了叫做try-with-resources的语法糖。则上面的代码可以改下如下:

/**
		 * try-with-resource语法糖
		 */
		try (FileInputStream in = new FileInputStream("d:/in.txt")) {
			// do something
		} catch(Exception e) {
			System.out.println("message:"+e.getMessage());
			throw new RuntimeException("try块中产生了异常",e);
		}

try()中的类型必须实现AutoCloseable接口(jdk1.7开始引入了此接口,作为Closeable接口的父接口)。

此结构的执行顺序为:

  1. 执行try快中语句

  2. 调用try()中的所有对象的close()方法

  3. 如果try块产生异常,则执行catch中的逻辑

  4. 如果存在finally块,则执行其逻辑

另外,还需要注意的是:

如果try块产生了异常,则会忽略close产生的异常(如果真的产生异常的话);否则才会抛出close产生的异常(如果真的产生异常的话)。

因此,try-with-resources语法糖等价于以下写法:

        // 此处的try相当于
        // try (FileInputStream in = new FileInputStream("d:/in.txt"))
        try {
            InputStream in = null;
            /**
             * 以下try-catch可以理解为语法糖自动生成的代码
             */
            try {
                in = new FileInputStream("d:/in.txt");
                // do something
                in.close();
            } catch (IOException e) {
                if (in != null)
                    try {
                        in.close();
                    } catch (IOException ee) {
                        if (e != ee)
                            e.addSuppressed(ee);
                    }
                throw e;
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
            throw new RuntimeException("try块中产生了异常", e);
        }


© 著作权归作者所有

拉风小野驴
粉丝 62
博文 24
码字总数 26595
作品 0
昌平
高级程序员
私信 提问
加载中

评论(2)

拉风小野驴
拉风小野驴 博主

引用来自“zzzzzzzzcy”的评论

这是 1.几 的特性
jdk1.7,这个我在标题中已经说明了
z
zzzzzzzzcy
这是 1.几 的特性
源码分析(三)-AutoCloseable源码分析

AutoCloseable 该接口用于try-with-resources语法糖提供支持,用于自动关闭资源作用 类型:接口 方法:close(); 详解: close():用于自动关闭资源的时候需要进行调用该方法,该方法声明中设置...

lonecloud
2018/05/28
17
0
java异常体系及1.7中的try-with-resources

1.java异常体系架构 异常指java运行过程出现的错误,在java中,将异常当作对象来处理,java.lang.Throwable是所有异常的超类。其架构如下图: image.png 1.1 Throwable Throwable是 Java 语言...

冬天里的懒喵
2017/12/02
0
0
浅谈AutoCloseable接口

一、前言 最近在翻看中间件源码时候发现有些类实现了AutoCloseable接口,这个接口很生疏,所以搜了下资料,学习了下,下面做个总结。 二、AutoCloseable接口由来 从AutoCloseable的注释可知它...

今天你不奋斗明天你就落后
2017/11/25
0
0
Java try-with-resources

try-with-resources 是个语法糖,实际上就是自动调用资源的 close() 函数 try 语句多了个括号,这种在 try 后面加个括号,再初始化对象的语法就叫 try-with-resources,上面代码等同于 编绎器...

林塬
2018/02/01
0
0
06-《深度拆解JVM》之JVM是如何处理异常的?

一、问题引入 今天我们来讨论下 Java 虚拟机的异常处理。众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可分为显式和隐式两种...

飞鱼说编程
2018/09/28
61
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 ——不知道假装开心,装的像么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :天黑了 你很忧愁, 你说世界上, 找不到四块五的妞, 行走在凌晨两点的马路上, 你疲倦地拿着半盒黄鹤楼。#今日歌曲推荐# 《四块...

小小编辑
今天
2.2K
16
64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
69
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
32
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
119
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部