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也可以用
在这里插入图片描述
在这里插入图片描述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/758734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树从根节点出发的所有路径

二叉树从根节点出发的所有路径 看上图中 二叉树结构 从根节点出发的所有路径 如下 6->4->2->1 6->4->2->3 6->4->5 6->8->7 6->8->9 逻辑思路: 按照先序遍历 加 回溯法 实现 代码如下 // 调用此方法,将根节点传递…

[2024-6-30]如何获取OpenAI API Key/OpenAI密钥

一、前言 由于官网页面更新,获取路径与之前有所不同。 二、获取路径 1.点击Products,再点击API login 2.点击API 3. 如果需要登录,则登录 4.点击API keys,再点击Create new secret key

python-求出 e 的值

[题目描述] 利用公式 e11/1!1/2!1/3!⋯1/𝑛!,求 e 的值,要求保留小数点后 10 位。输入: 输入只有一行,该行包含一个整数 n,表示计算 e 时累加到1/n!。输出: 输出只有一行,该行包含计…

决策树划分属性依据

划分依据 基尼系数基尼系数的应用信息熵信息增益信息增益的使用信息增益准则的局限性 最近在学习项目的时候经常用到随机森林,所以对决策树进行探索学习。 基尼系数 基尼系数用来判断不确定性或不纯度,数值范围在0~0.5之间,数值越低&#x…

【Django】网上蛋糕项目商城-关键字搜索,商品详情功能

概念 上文中已经实现热销和新品的商品列表功能,本文篇幅中实现关键字搜索商品,将商品加入购物车,以及查看商品的详情信息等功能 关键字搜索实现步骤 在head.html头部页面中,鼠标移动至搜索图标会显示隐藏的搜索框进行输入关键信…

内容营销专家刘鑫炜:碎片化时代,小微企业内容营销如何乘风破浪

当下,互联网高度发达,技术的飞速进步和社交媒体的普及,使得信息的产生和传播速度达到了前所未有的高度。互联网上的内容如同潮水般汹涌而来,不断刷新着我们的认知边界,但与此同时,这也导致了人们的注意力被…

阐述Python:except的用法和作用?

欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【python爬虫】豆瓣爬虫学习

文章目录 网页地址爬虫目标技术栈爬虫代码注意事项 Python爬虫学习:我们可以选择一个相对简单的网站进行数据抓取。这里以抓取“豆瓣电影Top250”的信息为例,这个网站提供了丰富的电影数据,包括电影名称、评分、导演、演员等信息。 网页地址…

【面试系列】数据工程师高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

Springboot与xxl-job

一、下载xxl-job项目 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从Gitee上面拉…

【three.js案例二】时空隧道

import * as THREE from ./build/three.module.js // 引入轨道控制器扩展库OrbitControls.js import { OrbitControls } from three/addons/controls/OrbitControls.js; // 引入dat.gui.js的一个类GUI import { GUI } from three/addons/libs/lil-gui.module.min.js;// 场景 co…

Go语言环境安装 第一个Go程序

Go下载地址 哪个能用用哪个。 https://go.dev/ https://golang.google.cn/(Golang官网的官方镜像) Windows 使用.msi安装包安装 下载msi文件 安装 双击运行go1.22.4.windows-amd64.msi Next 勾选I accept the terms in the License Agreement&…

ChatGPT的原理简介

目录 前言 1. 什么是ChatGPT? 2. GPT模型的基本原理 自注意力机制 预训练和微调 3. ChatGPT的工作流程 4. ChatGPT的优势和挑战 5. 实例对话 6. 未来展望 结语 前言 在这个智能科技飞速发展的时代,聊天机器人逐渐成为我们生活中的“新朋友”。…

Flask无法Debug

问题描述 Flask Debug的时候,可能会无法进入断点。我使用的是pycharm CE版本。 解决方案 确保pycharm安装路径不带空格。(带空格路径导致debug程序启动报错)Gevent compatible,这个东西老的pycharm版本必须勾选它,新…

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文…

python–基础篇–正则表达式–是什么

文章目录 定义一:正则表达式就是记录文本规则的代码定义一:正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。初识 Python 正则表达式 定义一&a…

Spark2.0

目录 10.3 Spark运行架构 10.3.1 基本概念 10.3.2 架构设计 ​编辑 10.3.3 Spark运行基本流程 Spark运行架构特点 10.3 Spark运行架构 10.3.1 基本概念 RDD :是 Resillient Distributed Dataset (弹性分布式数据集)的简称,是分…

界面组件DevExpress WinForms v24.1 - 支持DateOnly TimeOnly类型

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

Java17-时间类、包装类

目录 Date类 概述 常用方法 SimpleDateFormat类 概述 构造方法 格式规则 常用方法 Calendar类 概述 常用方法 get方法示例 set方法示例 add方法示例 JDK8时间相关类 ZoneId 时区 Instant 时间戳 ZoneDateTime 带时区的时间 DateTimeFormatter 用于时间的格式…

摸鱼大数据——Spark基础——Spark环境安装——Spark Local[*]搭建

一、虚拟机配置 查看每一台的虚拟机的IP地址和网关地址 查看路径: cat /etc/sysconfig/network-scripts/ifcfg-ens33 2.修改 VMware的网络地址: 使用VMnet8 3.修改windows的对应VMware的网卡地址 4.通过finalshell 或者其他的shell连接工具即可连接使用即可, 连接后, 测试一…