Java try-with-resource语法

本文探讨了在JDK1.7之前和之后如何管理外部资源,特别是使用try-with-resource语句来自动关闭资源,避免内存泄漏。文章详细解释了try-with-resource的原理,并介绍了异常抑制的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK1.7之前

在JDK1.7之前要确保外部资源关闭一般使用finally,如下

FileInputStream inputStream = null;
try {
    inputStream = new FileInputStream(new File("user.csv"));
    System.out.println(inputStream.read());
} catch (IOException e) {
    throw new RuntimeException(e.getMessage(), e);
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
}

try-with-resource

在JDK1.7及之后对于实现了AutoCloseable接口的对象可以使用try-with-resource语法,该语法会确保外部资源的close方法被调用。如下:

try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
    System.out.println(inputStream.read());
} catch (IOException e) {
    throw new RuntimeException(e.getMessage(), e);
}

原理

JDK1.7实现了的一个语法糖,其实对JVM虚拟机而言,它看到的依然是之前的写法,反编译后的结果:

try {
    FileInputStream inputStream = new FileInputStream(new File("test"));
    Throwable var2 = null;
    try {
        System.out.println(inputStream.read());
    } catch (Throwable var12) {
        var2 = var12;
        throw var12;
    } finally {
        if (inputStream != null) {
            if (var2 != null) {
                try {
                    inputStream.close();
                } catch (Throwable var11) {
                    var2.addSuppressed(var11);
                }
            } else {
                inputStream.close();
            }
        }
    }
} catch (IOException var14) {
    throw new RuntimeException(var14.getMessage(), var14);
}

异常抑制

反编译的代码有一处对异常的特殊处理:

var2.addSuppressed(var11);

这叫异常抑制。当对外部资源进行处理和关闭外部资源时都遇到异常,catch到的将会是对外部资源进行处理时遭遇的异常,关闭资源的异常将被“抑制”(但不是丢弃),通过异常的getSuppressed方法,可以提取出被抑制的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值