try()catch{}自动释放资源

简介: try()catch{}自动释放资源

我们在学习jdbc时,通过Connection,SqlSession ,inputStream等对象完成对数据库的操作,使用完资源后必须在finally中调一堆.close方法将资源关闭。那么有没有更好的方法呢?

//伪代码
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接口的类,在try()里声明该类实例的时候,在try结束后,close方法都会被调用比如Sqlsession它就是extends Closeable, Closeable extends AutoCloseable除了Sqlsession之外几乎所有的资源都可以用这种方式实现自动关闭资源,比如OutputStream,BufferedReader,PrintStream,InputStream等,都可以。据说到目前为止,只有JavaMail Transport对象不能利用这种方式实现自动关闭。


注意:如果try()里面有两个资源,用逗号分开,资源的close方法的调用顺序与它们的创建顺序相反。带有资源的try语句可以像一般的try语句一样具有catch和finally块。在try-with-resources语句中,任何catch或finally块都是在声明的资源被关闭后才会执行的。


总结


  1. 凡是实现了Closeable或AutoCloseable接口的类,在try()里声明该类实例的时候,在try结束后,close方法都会被调用.
  2. try结束后自动调用的close方法,这个动作会早于finally里调用的方法。
  3. 不管是否出现异常(int i=1/0会抛出异常),try()里的实例都会被调用close方法。
  4. 越晚声明的对象,会越早被close掉。



相关文章
每日一道面试题之try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
每日一道面试题之try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
163 0
|
6月前
|
Java 测试技术
使用try-catch-finally关闭资源更优雅的关闭try-with-resource
使用try-catch-finally关闭资源更优雅的关闭try-with-resource
92 1
try catch finally,try 里面有 return,finally 还执行吗?
try catch finally,try 里面有 return,finally 还执行吗?
70 0
try...catch中,catch加了return,后面的代码是不会执行的
try...catch中,catch加了return,后面的代码是不会执行的
105 0
Java 最常见的面试题:try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
Java 最常见的面试题:try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
|
JSON 安全 前端开发
替代try catch处理异常的优雅方式
替代try catch处理异常的优雅方式
|
编译器
throw后报错,找不到报错处。throw、throws 、try/catch 作用区别,自定义Exception异常,printStackTrace()方法的
throw后报错,找不到报错处。throw、throws 、try/catch 作用区别,自定义Exception异常,printStackTrace()方法的
169 2
|
Java
【学习笔记】【Java】try-catch-finally中,finally是在什么时候执行的:try结束、catch结束、return前
结论:try-catch-finally中,finally执行:try结束、catch结束、return前
194 0
【学习笔记】【Java】try-catch-finally中,finally是在什么时候执行的:try结束、catch结束、return前
|
NoSQL Java 数据库连接
finally 和 return,到底谁先执行
经常有人面试被问到:finally 和 return,到底谁先执行呢?
try-catch-finally 和 return 是怎么执行的?
来源:http://liangfei.me/ 最近一直在看Java虚拟机规范,发现直接分析bytecode更能加深对Java语言的理解。 之前看过一篇关于 return 和 finally 执行顺序的文章,仅在 Java 的语言层面做了分析,其实我倒觉得直接看 bytecode 可能来的更清晰一点。