try(){}自动释放资源,AutoCloseable

  我们在使用资源的时候,必须关闭资源,比如使用jdbc连接或者inputStream的时候,必须在finally中将资源关闭。然而有的时候我们会忘记关闭资源。那么有没有更好的方法呢?

   

SqlSession sqlSession = sqlSessionFactory.openSession()
try  {
    //......
}finally{
 sqlSession.close();
}

  从jdk1.7开始,   Java 7增强了try语句的功能——它允许在try关键字后跟一对圆括号,圆括号可以声明,初始化一个或多个资源,此处的资源指得是那些必须在程序结束时必须关闭的资源(比如数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。这种称为try-with-resources语句。

  

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    //......
}

  像这样的话,执行完sqlsession会自动关闭,不用我们在finally中关闭,也再也不用担心忘记关闭了。

  那么为什么这样可以自动关闭资源呢?是不是所有的资源都可以这样关闭呢?

  实际上只要这些资源实现类实现了Closeable或AutoCloseable接口,就可以自动关闭。比如Sqlsession它就是extends Closeable, Closeable extends AutoCloseable。

  几乎所有的资源都可以用这种方式实现自动关闭资源,比如OutputStream,BufferedReader,PrintStream,InputStream等,都可以。据说到目前为止,只有JavaMail Transport对象不能利用这种方式实现自动关闭。

  注意:如果try()里面有两个资源,用逗号分开,资源的close方法的调用顺序与它们的创建顺序相反。

     带有资源的try语句可以像一般的try语句一样具有catch和finally块。在try-with-resources语句中,任何catch或finally块都是在声明的资源被关闭后才会执行的。

原文地址:https://www.cnblogs.com/heqiyoujing/p/10759451.html

时间: 2024-10-19 13:51:55

try(){}自动释放资源,AutoCloseable的相关文章

java7(3)——增强的catch之自动释放资源

跟mutilcatch一样,java7提供了自动释放资源的方法,但还是很少看到人使用,估计是麻烦去重写close方法.不过jdk内部一些类已经改成使用增强的catch来释放资源的写法,所以我们有必要了解一下这个功能. 顾名思义,自动释放资源就是我们不用再在fianlly里面去close掉资源了,close这个步骤有程序底层自动完成. 举个栗子: [要自动释放资源的类]: 1 public class CustomResource implements AutoCloseable { 2 3 @O

Creator 自动释放资源总结

Creator 版本 :2.0.5 项目资源释放采用 creator 场景自动释放资源,但手动 cc.loader 加载的资源需要进行手动释放.释放过程中需要注意以下几点: 1.两个场景资源不要共用同一个资源(适用于大厅和子游戏) 2.prefab 上有 mask 与 spine 组件,释放之后.再次进入场景,图片会花屏.官方给出的解释就是这样设计的,不过之后creator版本修改这个问题 3.手动加载的资源也可以设置为让场景自动释放 加载prefab调用 cc.loader.setAutoRe

JDK1.7中新增自动释放资源接口AutoCloseable

新增了try-with-resource 异常声明 在JDK7中只要实现了AutoCloseable或Closeable接口的类或接口,都可以使用try-with-resource来实现异常处理和资源关闭 异常抛出顺序.在Java se 7中的try-with-resource机制中异常的抛出顺序与Java se 7以前的版本有一点不一样. 是先声明的资源后关闭 JDK7以前如果rd.readLine()与rd.close()(在finally块中)都抛出异常则只会抛出finally块中的异常,

自动锁

新学了一个技巧:自动锁,类似于ace的自动锁,进入作用域声明一个用mutex初始化的自动锁对象,对象声明成功则表示获取锁资源成功,程序继续运行,否则持续等待:在离开作用域时自动释放锁. class AutoLock{public:    AutoLock(pthread_mutex_t* pMutex):m_mutex(pMutex)    {        pthread_mutex_lock(m_mutex);    }    ~AutoLock()    {        pthread_

使用代码来加载资源和释放资源

资源不只是可以通过编辑器绑定获取. 其实他还可以使用代码来动态加载. cc.loader 1.它有3个默认的Pipeline(管道): (1)assetLoader:主要用于加载资源,加载asset类型资源和释放这些资源 (2)downloader:主要用于下载文件,文本,图像,脚本,声音,字体,自定义的download (3)loader:第三个是默认的Pipeline可以加载json,image,plist,fnt,uuid; 2.资源分为本地(assets目录下)和远程资源 3.加载分为同

[Java开发之路](20)try-with-resource 异常声明

Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源. 在java7以前,程序中使用的资源需要被明确地关闭,过程有点繁琐,如下所示: package com.qunar.lectures.tryResource; import java.io.*; import java.util.ArrayList; import java.util.List; /** * Created by xiaosi on 16-3-4. *

传智播客 2015 刘意 Java基础-视频-笔记day27(完结)(2016年5月1日12:42:20)

day27 1.类的加载概述和加载时机 2.类加载器的概述和分类 类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象. 虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行. 类加载器的组成 Bootstrap ClassLoader根类加载器 Extension ClassLoader扩展类加载器 SysetmClassLoader系统类加载器 通过这些描述我们就可以知道我们常用的东西的加载都是由谁来完成的. 到目前为止我们已经知道把class文

JAVA NIO学习记录2-非阻塞式网络通信

一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降. Java NIO 是非阻塞模式的.当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务.线程通常将非阻塞IO 的空闲时间用于在其他通道上执行I

12、NIO--Path、、Paths、Files

NIO.2 随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2.因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分 Path 与 Paths ? java.nio.file.Path 接口代表一个平台无关的平台路径,描述了目 录结构中文件的位置.? Paths 提供的 get() 方法用来获取 Path 对象: ? Path get(String first, String … more) : 用于