我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用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 关键字,所以无法再进行赋值。但是至于为什么这么设计,我暂时没找到答案。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中怎么使用try-with-resource机制关闭连接

本篇内容主要讲解“java中怎么使用try-with-resource机制关闭连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中怎么使用try-with-resource机制关闭连接”
2023-06-20

java中怎么使用try-with-resource实现输入输出流自动关闭

本篇内容介绍了“java中怎么使用try-with-resource实现输入输出流自动关闭”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!tr
2023-06-20

如何使用xshell连接linux虚拟机

要使用Xshell连接Linux虚拟机,您需要按照以下步骤进行操作:1. 下载和安装Xshell软件:您可以从Xshell官方网站或其他可信的软件下载网站下载Xshell。安装完成后,打开Xshell软件。2. 创建一个新的会话:在Xshe
2023-09-18

docker虚拟机中如何使用ssh连接

本篇内容介绍了“docker虚拟机中如何使用ssh连接”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、安装docker这里就不演示怎么安装
2023-06-27

如何在 Golang 中使用关联查询连接表?

关联查询连接表通过 sql 查询结合多个表中的数据。在 golang 中,使用 sql.db.query() 函数,指定查询字符串和参数。可以使用不同的关联类型,如 inner join、left join、right join 和 ful
如何在 Golang 中使用关联查询连接表?
2024-05-14

云服务器和主机如何连接使用

云服务器和主机之间的连接需要通过公网线路进行连接。以下是一些常见的连接方式:HTTP/1端口:在云服务器的主机地址处添加“HTTP/1”的端口号,如1。这样在客户端访问云服务器时,就会将该端口打开。HTTP/2端口:在云服务器的主机地址处添加“HTTP/2”的端口号,如2。这样在客户端访问云服务器时,就会将该端口打开。HTTP/3端口:如果需要在两个云服务器之间传输文件,可以在云服务器上添加端口号为“HTTP/3”的端口...
2023-10-27

如何使用Xshell连接VMware上的Linux虚拟机

本篇内容主要讲解“如何使用Xshell连接VMware上的Linux虚拟机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Xshell连接VMware上的Linux虚拟机”吧!步骤:1.
2023-06-21

ubuntu20.04如何使用蓝牙连接手机互传文件

这篇文章将为大家详细讲解有关ubuntu20.04如何使用蓝牙连接手机互传文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在工作中我们经常需要在手机与电脑之间传文件,但是在没有网络的情况下我们通常会使用
2023-06-13

.NET5控制台程序如何使用EF连接MYSQL数据库

小编给大家分享一下.NET5控制台程序如何使用EF连接MYSQL数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.使用nuget下载:Microsoft.E
2023-06-20

阿里云服务器如何使用网络连接手机

阿里云服务器使用网络连接手机可能会因不同的云服务器而有所不同,但以下是一些常见的步骤:登录阿里云服务器管理器。在这里我们可以查看我们已经连接到的阿里云服务器以及其IP和端口。打开我们的手机,并通过蓝牙或USB连接到阿里云服务器。打开云服务器的配置程序,如"MyCloud",并输入我们的云服务器账号和密码。进入云服务器主界面,如"File",我们可以进行各种设置,包括配置服务器、设置云存
2023-10-26

主机免费云服务器如何连接电脑使用

免费云服务器通常具有以下特点:价格便宜:与收费的云服务器相比,免费的云服务器价格相对较低。这使得很多人都可以负担得起并获得免费的云服务器。可扩展性强:免费的云服务器通常可以扩展到数倍于所需的容量和带宽。这意味着,如果您的应用程序需要更大的处理能力或更高的内存容量,那么您可以使用更大的云服务器来满足这些需求。易于管理:免
2023-10-27

主机免费云服务器如何连接电脑上使用

对于企业而言,云服务器是一种高效的解决方案。它可以提供更高的性能、更低的成本和更快的部署速度,为企业提供了可靠的技术支持和更大的灵活性。云服务器不仅能够帮助企业快速搭建应用程序,还能够实现资源共享和管理,大大提高了企业的运营效率。对于个人而言,云服务器也是一个很好的选择。它可以提供高效的计算资源,同时还能够提供在线存储
2023-10-27

使用adb devices看不到已连接的真机,如何处理?

常见问题:进行APP自动化测试,必不可少的就是连接真机进行测试,但是经常会出现真机已经通过USB连接到电脑上,但是adb的设备列表中任然找不到设备。对于这种问题,很多小伙伴不知道怎么解决。 解决办法:将手机的VID添加到.android目录
2023-08-24

如何使用 ORM(对象关系映射)简化 PHP 数据库连接?

使用 orm 简化 php 数据库连接,将关系数据库中的表和数据映射到应用程序中的对象,可极大简化与数据库的交互。orm 的好处包括简化的 crud 操作、自动映射、对象关系和提高可维护性。实战案例:使用 doctrine 框架在 php
如何使用 ORM(对象关系映射)简化 PHP 数据库连接?
2024-05-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录