Java 9 新特性—try-with-resources的升级

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

只要学过 Java 的小伙伴都需要知道,资源用了是要关闭的,否则会发生大麻烦,轻则被骂,重则滚蛋,不要以为是玩笑话,很严重的!!

Java 7 之前,资源需要手动关闭

我相信有5 年以上工作经验的小伙伴一定写过这样的代码:

FileInputStream fileInputStream = null;
try {
    fileInputStream = new FileInputStream("file.txt");
    // 读取文件内容
} catch (IOException e) {
    // 处理异常
} finally {
    if (fileInputStream != null) {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            // 处理关闭异常
        }
    }
}

这是因为,在 Java 7 之前,需要我们手动关闭各种资源,包括文件、数据库连接、网络套接字等等其他可能需要显式关闭的资源。但是这种关闭资源的方式存在几个问题:

  • 容易忽略关闭资源的步骤,导致资源泄漏。
  • 需要编写冗长的 try-catch-finally 代码,降低了代码的可读性。
  • 异常处理变得复杂,需要额外的嵌套 try-catch 块来处理关闭资源时可能出现的异常。

Java 7 中的 try-with-resources

为了解决上面的问题,Java 7 引入了 try-with-resources 语法。try-with-resources 是一个用于简化资源管理的语法糖,它可以自动关闭实现了 AutoCloseable 或 Closeable 接口的资源,无需显式编写资源关闭代码。这种特性有如下几个优点:

  • 资源自动化管理,减少了资源泄漏的风险。
  • 减少了编写冗长的 try-catch-finally ,简化了代码,提高了代码的可读性和可维护性。
  • 自动处理资源关闭时的异常。

使用 try-with-resources 的步骤如下:

1、资源必须实现 AutoCloseable 或 Closeable 接口

要使用 try-with-resources,资源必须是实现了 AutoCloseable(Java 7 引入)或 Closeable( Java 5 引入)接口的类的实例。这些接口要求资源类提供一个 close 方法,用于在不再需要资源时执行清理操作。例如:

public class Resource implements AutoCloseable{
    
    public void doSome() {
        System.out.println("do something....");
    }
    
    @Override
    public void close() throws Exception {
        System.out.println("关闭了 Resource 资源");
    }
}

2、语法

try-with-resources 使用 try 块来声明和初始化资源。资源的声明必须在圆括号内,资源会在 try 块退出时自动关闭。此语法还可以包括一个 catch 块来处理可能抛出的异常。例如:

public class ResourceTest {
    public static void main(String[] args) {
        try(Resource resourceTest = new Resource()) {
            resourceTest.doSome();
        } catch (Exception e) {
            // 处理异常
        }
    }
}

3、自动关闭资源

在 try 块退出时,资源会自动关闭,即使在 try 块内发生异常也会如此。资源的 close() 会被调用以释放资源,并且资源的关闭异常会被抛出或被抑制(附加到原始异常中)。例如上诉代码执行结果如下:

do something....
关闭了 Resource 资源

不管是正常退出还是因为异常退出,都会自动调用资源的 close() 来释放资源。

4、多个资源

我们可以在同一个 try-with-resources 语句中管理多个资源,它会按照声明的顺序被初始化和关闭。多个资源的声明使用分号分隔。如下:

try (Resource1 resource1 = new Resource1();
     Resource2 resource2 = new Resource2();
     Resource3 resource2 = new Resource3()) {
     // 使用 resource1、resource2、resource3
} catch (Exception e) {
    // 处理异常
}
// 在这里,resource1、resource2、resource3 都会自动关闭

但是资源的关闭顺序与它们的声明顺序相反,即最后声明的资源最先关闭。

public class ResourceTest {
    public static void main(String[] args) {
        try(Resource1 resource1 = new Resource1();
            Resource2 resource2 = new Resource2();
            Resource3 resource3 = new Resource3()) {

        } catch (Exception e) {
            // 处理异常
        }
    }
}
// 结果......
关闭了 Resource3 资源
关闭了 Resource2 资源
关闭了 Resource1 资源

Java 9 对 try-with-resources 的改进

Java 7 虽然利用 try-with-resources 来优化了资源的管理,无须我们手动关闭资源,但是它依然是不够完美,它要求管理的资源必须在 try 子句中初始化,否则编译不通过,如下:

为了解决这个问题,Java 9 对其改进了:**如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。**例如我们将编译环境调整到 Java 9 及以上去:

执行结果:

关闭了 Resource3 资源
关闭了 Resource2 资源
关闭了 Resource1 资源

通过这个例子我们就可以看到 Java 在不断地进步,对 Java 的未来充满信心!!!

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值