try(){}自动释放资源

Java 7 引入了try-with-resources语句,简化了资源关闭的过程,避免了忘记关闭资源的问题。资源必须实现Closeable或AutoCloseable接口,例如SqlSession。当try块执行完毕或发生异常时,资源会自动关闭,且关闭顺序与声明顺序相反。这种改进提高了代码的可读性和安全性。

原先背景与做法

改进 

说明


 

原先背景与做法

我们在使用资源的时候,必须关闭资源,比如使用jdbc连接或者inputStream的时候,必须在finally中将资源关闭。

比如获取Mybatis框架的SqlSession的时候 

package com.dao;

import com.lingaolu.dao.DeptDao;
import com.lingaolu.pojo.Dept;
import com.lingaolu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author 林高禄
 * @create 2020-10-12-9:56
 */
public class DeptDaoTest {

    @Test
    public void getDeptList(){
        SqlSession sqlSession = null;
        try{
            sqlSession = MybatisUtils.getSqlSession();
            DeptDao mapper = sqlSession.getMapper(DeptDao.class);
            List<Dept> deptList = mapper.getDeptList();
            deptList.forEach(System.out::println);
        }catch (Exception e){

        }finally {
           if(null != sqlSession){
               sqlSession.close();
           }
        }

    }
}

 

但是这样写显很麻烦,并且有的时候我们会忘记关闭资源。那么有没有更好的方法呢?

改进 

 我使用的Java版本是1.8,这里也有了提示

 

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

再看Mybatis的官网,也使用了这种做法

所以我们就把代码改为这种方式

package com.dao;

import com.lingaolu.dao.DeptDao;
import com.lingaolu.pojo.Dept;
import com.lingaolu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author 林高禄
 * @create 2020-10-12-9:56
 */
public class DeptDaoTest {

    @Test
    public void getDeptList(){
        try(SqlSession sqlSession = MybatisUtils.getSqlSession()){
            DeptDao mapper = sqlSession.getMapper(DeptDao.class);
            List<Dept> deptList = mapper.getDeptList();
            deptList.forEach(System.out::println);
        }
    }
}

 

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

说明

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

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

我们看SqlSession是实现了Closeable接口

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

注意:

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

 

在 Java 中,**`try-with-resources` 是释放资源的更好方式**,尤其是在处理需要关闭资源(如文件流、网络连接、数据库连接等)时。 --- ## ✅ `try-with-resources` 与 `finally` 的对比 | 对比项 | `try-with-resources` | `finally` | |--------|----------------------|-----------| | 自动关闭资源 | ✅ 是,自动调用 `close()` 方法 | ❌ 需要手动编写关闭逻辑 | | 异常处理 | 可以捕获 `try` 和 `close()` 抛出的异常 | 仅能通过 catch 捕获 try 块中的异常 | | 可读性 | 更简洁、清晰 | 繁琐,容易出错 | | 资源泄漏风险 | 极低 | 高(如果忘记写 close 或发生异常) | --- ## ✅ 示例代码:使用 `try-with-resources` ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileReaderExample { public static void main(String[] args) { String path = "example.txt"; // 使用 try-with-resources 自动关闭 BufferedReader try (BufferedReader reader = new BufferedReader(new FileReader(path))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ``` ### 🔍 解释: - `BufferedReader` 实现了 `AutoCloseable` 接口; - 在 `try` 后面的小括号中声明并初始化资源; - JVM 会自动在 `try` 块结束后调用 `close()`; - 即使在读取过程中抛出异常,也能保证资源关闭; --- ## ❌ 示例代码:使用 `finally` 手动释放资源 ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileReaderExampleLegacy { public static void main(String[] args) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` ### 🔍 解释: - 必须手动检查 `reader` 是否为 `null`; - `close()` 也可能抛出异常,必须再次 try-catch; - 冗余代码多,维护成本高; - 容易遗漏或错误关闭资源; --- ## ✅ 总结建议: - **Java 7+ 推荐使用 `try-with-resources`**; - 如果你使用的类实现了 `AutoCloseable` 或 `Closeable` 接口,都可以用于 `try-with-resources`; - `finally` 适用于旧版本 Java 或非资源释放场景(如清理状态变量); ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林高禄

你打不打赏,我都会一直写博客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值