如何使用try-with-resource机制关闭连接

 更新时间:2021年07月31日 15:27:16   作者:滴哩哩哩滴哩哩哩哒哒  
这篇文章主要介绍了使用try-with-resource机制关闭连接的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用try-with-resource机制关闭连接

JAVA的一大特性就是JVM会对内部资源实现自动回收

即自动GC,给开发者带来了极大的便利。但是JVM对外部资源的引用却无法自动回收,例如数据库连接,网络连接以及输入输出IO流等,这些连接就需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占用等。

传统的手动释放外部资源一般放在

try{}catch(){}finally{}机制的finally代码块中,因为finally代码块中语句是肯定会被执行的,即保证了外部资源最后一定会被释放。同时考虑到finally代码块中也有可能出现异常,finally代码块中也有一个try{}catch(){},这种写法是经典的传统释放外部资源方法,显然是非常繁琐的。

JDK1.7之后有了try-with-resource处理机制

首先被自动关闭的资源需要实现Closeable或者AutoCloseable接口,因为只有实现了这两个接口才可以自动调用close()方法去自动关闭资源。写法为try(){}catch(){},将要关闭的外部资源在try()中创建,catch()捕获处理异常。

其实try-with-resource机制是一种语法糖,其底层实现原理仍然是try{}catch(){}finally{}写法,不过在catch(){}代码块中有一个addSuppressed()方法,即异常抑制方法。

如果业务处理和关闭连接都出现了异常,业务处理的异常会抑制关闭连接的异常,只抛出处理中的异常,仍然可以通过getSuppressed()方法获得关闭连接的异常。

和传统的try{}catch(){}finally{}机制相比,try-with-resource处理机制有了这个异常抑制方法就是帮助我们简化了关闭连接时出现异常的处理。

try-with-resource使用时遇到的问题

java 1.7之后 增加了 try-wit-resource的语法糖

大概的用法就是在try中声明一个或者多个的流,会在try块代码执行完成后自动关闭流,不用再写finally进行手都关闭。

try (InputStream is1 = ...;
     InputStream is2 = ...;) {
    //do something
} catch{
}

于是我就在项目中想改成这种写法,但是在改的过程中遇到了一些问题。我的代码中需要对声明过后的流再赋值,但是用这样的写法一直会报错

代码大概是这样的:

此时会编译出错:

The resource is1 of a try-with-resources statement cannot be assigned;

报错的原因是:

try-with-source中声明的变量无法被更改。但是我很奇怪这是为什么,上网搜了没有搜到,于是去找了一下官方文档。官方文档中有一段这样的描述:

It is a compile-time error if final appears more than once as a modifier for each variable declared in a resource specification. A variable declared in a resource specification is implicitly declared final (§4.12.4) if it is not explicitly declared final.

意思就是,try-with-resource中声明的变量会隐式的加上final 关键字,所以无法再进行赋值。但是至于为什么这么设计,我暂时没找到答案。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis三种批量插入数据的方式

    Mybatis三种批量插入数据的方式

    这篇文章主要介绍了Mybatis的三种批量插入方式,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java实现雪花算法的示例代码

    Java实现雪花算法的示例代码

    SnowFlow算法是Twitter推出的分布式id生成算法,主要核心思想就是利用64bit的long类型的数字作为全局的id。本文将用Java语言实现雪花算法,感兴趣的可以学习一下
    2022-03-03
  • SpringBoot事件发布和监听详解

    SpringBoot事件发布和监听详解

    今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节,所以下面这篇文章主要给大家介绍了关于SpringBoot事件发布和监听的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • Gradle jvm插件系列教程之Java Library插件权威详解

    Gradle jvm插件系列教程之Java Library插件权威详解

    这篇文章主要介绍了Java Library插件权威详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • java的Console类的使用方法及实例

    java的Console类的使用方法及实例

    这篇文章主要介绍了java的Console类的使用方法及实例的相关资料,需要的朋友可以参考下
    2017-07-07
  • 代理模式之Java动态代理实现方法

    代理模式之Java动态代理实现方法

    今天一个偶然的机会我突然想看看JDK的动态代理,因为以前也知道一点,而且只是简单的想测试一下使用,使用很快里就写好了这么几个接口和类,需要的朋友可以参考下
    2012-11-11
  • Springboot GET和POST请求参数获取方式小结

    Springboot GET和POST请求参数获取方式小结

    Spring Boot GET和POST请求参数获取是开发人员经常需要解决的问题,本文主要介绍了Springboot GET和POST请求参数获取方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • JAVA设计模式中的策略模式你了解吗

    JAVA设计模式中的策略模式你了解吗

    这篇文章主要为大家详细介绍了JAVA设计模式中的策略模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • SpringBoot集成POI实现Excel导入导出的示例详解

    SpringBoot集成POI实现Excel导入导出的示例详解

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。本文主要介绍通过SpringBoot集成POI工具实现Excel的导入和导出功能,需要的可以参考一下
    2022-07-07
  • Spring集成MongoDB的两种方法实例

    Spring集成MongoDB的两种方法实例

    最近使用到了Spring框架,考虑到数据的格式并非有固定的字段格式,因此考虑到使用MongoDB非关系型数据库存储数据,所以这篇文章主要给大家介绍了Spring集成MongoDB的两种方法,需要的朋友可以参考下
    2021-09-09

最新评论