欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Java进阶-try-with-resources

Java进阶-try-with-resources

2024/10/23 23:27:51 来源:https://blog.csdn.net/qq_44717657/article/details/140077648  浏览:    关键词:Java进阶-try-with-resources

Java进阶-try-with-resources

  • try-with-resources 是什么
    • 传统使用try-catch-finally关闭资源
    • 使用try-with-resources
    • 什么时候用

try-with-resources 是什么

try-with-resourcesJava 7 中引入的一个新特性,用于简化资源管理,一般是用于处理实现了 AutoCloseable 或 Closeable 接口的资源(如文件、数据库连接等),用于确保在使用完资源后自动关闭资源,避免资源泄漏

简化上面的内容其实就一个:自动关闭资源。在了解自动关闭资源之前,我们看看,不自动关闭资源(也就是手动关闭)是什么样的。

下面看看在传统try-catch-finally语句中来手动关闭资源的过程。

传统使用try-catch-finally关闭资源

在我们常规的try-catch-finally语句中经常可以看到这样的操作:

BufferedReader br = null;
try {	//在yry-catch中获取文件br = new BufferedReader(new FileReader("example.txt"));String line;while ((line = br.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {//异常捕获e.printStackTrace();
} finally {if (br != null) {try {//注意这里 使用完资源需要关闭br.close();} catch (IOException e) {e.printStackTrace();}}
}

亦或是以下的自己手动获取数据库连接的操作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TraditionalJDBCExample {public static void main(String[] args) {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {// 加载JDBC驱动Class.forName("com.mysql.cj.jdbc.Driver");// 获取连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "admin", "123456");String sql = "SELECT id, name, email FROM users";stmt = conn.prepareStatement(sql);// 执行查询rs = stmt.executeQuery();// 处理结果集 -伪代码} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭相关资源if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

请注意上面资源关闭的代码
无论是读取文件的:

  br.close();

还是数据库的:

rs.close();
stmt.close();
conn.close();

都需要再加一层try-catch,如果不加还不行
在这里插入图片描述
这样就导致我们的代码看起来非常的繁琐, try-catch套了一层又一层,这可真是老母猪戴x罩: 一套又一套。
在这里插入图片描述
在上述的场景中,我们不仅要手动关闭资源,而且可能还要写额外代码,尤其是finally中的try-catch,不写还不行。

但是如果我们使用try-cath-resources的话其实就会简单很多

使用try-with-resources

与上面的try-catch-finally不一样,try-with-resources的使用略有不同

try-catch-finally的常规使用如下

        try {//声明自己的资源} catch(Exception e) {//抛出异常} finally {//关闭资源}

try-with-resources的使用如下,注意try后面的括号,相较于上面多了一个(),括号内是需要关闭的资源

		try(//需要自动关闭的资源 执行结束会自动关闭) {//对资源的操作} catch(Exception e) {//抛出异常}//由于不需要手动关闭资源,所以不需要finally

来将上面的读取文件部分代码,改为try-with-resources如下

//把资源放入try的()中 里面的资源会自动关闭
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}

明显简洁了很多
同样的,相对于获取数据库连接也使用try-with-resources

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TryWithResourcesJDBCExample {public static void main(String[] args) {// 加载JDBC驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();return;}String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "admin";String password = "123456";String sql = "SELECT id, name, email FROM users"; 使用try-with-resources语句来管理资源try (//这里面的资源会自动关闭Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement stmt = conn.prepareStatement(sql);ResultSet rs = stmt.executeQuery()) {// 处理结果集 -- 伪代码} catch (SQLException e) {e.printStackTrace();}}
}

省略了finally中的关闭资源的代码后,明显简洁了很多。

那么什么时候用呢?

什么时候用

还记得我们开头的那句话吗:实现了 AutoCloseable 或 Closeable 接口的资源
你只需要按住ctrl点你使用的资源类,查看它以及它的父类有没有实现AutoCloseable或者Closeable接口,只要有以下的内容,大胆的用
在这里插入图片描述
或者是文件的读取在这里插入图片描述
你像常规的InputStream、OutputStream以及其子类都是可以用的

在这里插入图片描述
在这里插入图片描述
还有一些比如Ftp相关以及网络编程的Socket也可以用
在这里插入图片描述
在这里插入图片描述

还是那句话,能不能用,点进去看看就知道了

下课下课在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com