Java Catching and Handling Exceptions(二)
一、Try with resources语句
try with resources语句是声明一个或多个资源的try语句。资源是程序使用完后必须关闭的对象。try with resources语句确保在语句末尾关闭每个资源。任何实现java.lang.AutoCloseable的对象(包括实现java.io.Closeable的所有对象)都可以用作资源。
下面的示例从文件中读取第一行。它使用BufferedReader的实例从文件中读取数据。BufferedReader是一种资源,必须在程序完成后关闭:
static String readFirstLineFromFile(String path) throws IOException {try (BufferedReader br =new BufferedReader(new FileReader(path))) {return br.readLine();}
}
在本例中,try-with-resources语句中声明的资源是BufferedReader。声明语句出现在try关键字后面的括号中。在Java SE 7和更高版本中,类BufferedReader实现了接口Java.lang.AutoCloseable。由于BufferedReader实例是在try with resource语句中声明的,因此无论try语句是正常完成还是突然完成(作为方法BufferedReader.readLine()引发IOException的结果),它都将被关闭。
在JavaSE7之前,您可以使用finally块来确保关闭资源,无论try语句是正常完成还是突然完成。下面的示例使用finally块而不是try with resources语句:
static String readFirstLineFromFileWithFinallyBlock(String path)throws IOException {BufferedReader br = new BufferedReader(new FileReader(path));try {return br.readLine();} finally {br.close();}
}
然而,在本例中,如果方法readLine()和close都抛出异常,则方法readFirstLineFromFileWithFinallyBlock()抛出从finally块抛出的异常;从try块引发的异常被抑制。相反,在示例readFirstLineFromFile()中,如果从try块和try with resources语句中抛出异常,则方法readFirst LineFrom()抛出从try区块抛出的异常;从try-with-resources块引发的异常被抑制。在JavaSE7和更高版本中,您可以检索被抑制的异常;有关详细信息,请参阅抑制的异常一节。
您可以在try-with-resources语句中声明一个或多个资源。下面的示例检索压缩文件zipFileName中打包的文件的名称,并创建包含这些文件名称的文本文件:
public static void writeToFileZipFileContents(String zipFileName,String outputFileName)throws java.io.IOException {java.nio.charset.Charset charset =java.nio.charset.StandardCharsets.US_ASCII;java.nio.file.Path outputFilePath =java.nio.file.Paths.get(outputFileName);// Open zip file and create output file with// try-with-resources statementtry (java.util.zip.ZipFile zf =new java.util.zip.ZipFile(zipFileName);java.io.BufferedWriter writer =java.nio.file.Files.newBufferedWriter(outputFilePath, charset)) {// Enumerate each entryfor (java.util.Enumeration entries =zf.entries(); entries.hasMoreElements();) {// Get the entry name and write it to the output fileString newLine = System.getProperty("line.separator");String zipEntryName =((java.util.zip.ZipEntry)entries.nextElement()).getName() +newLine;writer.write(zipEntryName, 0, zipEntryName.length());}}
}
在本例中,try-with-resources语句包含两个由分号分隔的声明:ZipFile和BufferedWriter。当直接跟在它后面的代码块正常或由于异常而终止时,BufferedWriter和ZipFile对象的close()方法将按此顺序自动调用。请注意,资源的close方法是按其创建的相反顺序调用的。
下面的示例使用try with resources语句自动关闭java.sql.statement对象:
public static void viewTable(Connection con) throws SQLException {String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";try (Statement stmt = con.createStatement()) {ResultSet rs = stmt.executeQuery(query);while (rs.next()) {String coffeeName = rs.getString("COF_NAME");int supplierID = rs.getInt("SUP_ID");float price = rs.getFloat("PRICE");int sales = rs.getInt("SALES");int total = rs.getInt("TOTAL");System.out.println(coffeeName + ", " + supplierID + ", " +price + ", " + sales + ", " + total);}} catch (SQLException e) {JDBCTutorialUtilities.printSQLException(e);}
}
本例中使用的资源java.sql.Statement是JDBC 4.1和更高版本API的一部分。
注意:try-with-resources语句可以像普通的try语句一样具有catch和finally块。在try-with-resources语句中,任何catch或finally块都在声明的资源关闭后运行。
二、Suppressed Exceptions
可以从与try-with-resources语句关联的代码块中引发异常。在示例writeToFileZipFileContents()中,可以从try块引发异常,并且当try with resources语句尝试关闭ZipFile和BufferedWriter对象时,可以从该语句引发多达两个异常。如果从try块引发异常,并且从try with resources语句引发一个或多个异常,则从try with resources.语句引发的那些异常将被抑制,并且该块引发的异常是由writeToFileZipFileContents()方法引发的异常。通过从try块引发的异常中调用Throwable.getSuppressed()方法,可以检索这些被抑制的异常。
三、实现自动关闭或可关闭接口的类
请参阅AutoCloseable和Closeable接口的Javadoc,以获取实现这两个接口之一的类的列表。Closeable界面扩展了AutoCloseable接口。Closeable接口的close()方法抛出IOException类型的异常,而AutoCloseble接口的closer()方法则抛出Exception类的异常。因此,AutoCloseable接口的子类可以覆盖close()方法的这种行为,以抛出专门的异常,如IOException,或者根本没有异常。
四、将所有内容放在一起
前面的部分描述了如何在ListOfNumbers类中为writeList()方法构造try、catch和finally代码块。现在,让我们遍历代码并研究可能发生的情况。
将所有组件放在一起时,writeList()方法如下所示。
public void writeList() {PrintWriter out = null;try {System.out.println("Entering" + " try statement");out = new PrintWriter(new FileWriter("OutFile.txt"));for (int i = 0; i < SIZE; i++) {out.println("Value at: " + i + " = " + list.get(i));}} catch (IndexOutOfBoundsException e) {System.err.println("Caught IndexOutOfBoundsException: "+ e.getMessage());} catch (IOException e) {System.err.println("Caught IOException: " + e.getMessage());} finally {if (out != null) {System.out.println("Closing PrintWriter");out.close();}else {System.out.println("PrintWriter not open");}}
}
如前所述,该方法的try块具有三种不同的退出可能性;这里有两个。
- try语句中的代码失败并引发异常。这可能是新FileWriter语句导致的IOException,也可能是for循环中错误的索引值导致的IndexOutOfBoundsException。
- 一切成功,try语句正常退出。
让我们看看在这两种退出可能性期间,writeList()方法中发生了什么。
1、场景1:发生异常
由于多种原因,创建FileWriter的语句可能会失败。例如,如果程序无法创建或写入所指示的文件,FileWriter的构造函数将引发IOException。
当FileWriter抛出IOException时,运行时系统立即停止执行try块;正在执行的方法调用未完成。然后,运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。在本例中,当IOException发生时,FileWriter构造函数位于调用堆栈的顶部。然而,FileWriter构造函数没有适当的异常处理程序,因此运行时系统检查方法调用堆栈中的下一个方法——writeList()方法。writeList()方法有两个异常处理程序:一个用于IOException,另一个用于IndexOutOfBoundsException。
运行时系统按照writeList()的处理程序在try语句之后出现的顺序来检查它们。第一个异常处理程序的参数是IndexOutOfBoundsException。这与引发的异常类型不匹配,因此运行时系统检查下一个异常处理程序-IOException。这与引发的异常类型匹配,因此运行时系统结束对适当异常处理程序的搜索。既然运行库已经找到了适当的处理程序,那么就执行该catch块中的代码。
在异常处理程序执行后,运行时系统将控制传递给finally块。finally块中的代码执行,而不管它上面捕获到什么异常。在这种情况下,FileWriter从未打开,也不需要关闭。在finally块完成执行后,程序继续执行finally模块之后的第一条语句。
这是ListOfNumbers程序的完整输出,在引发IOException时出现。
Entering try statement
Caught IOException: OutFile.txt
PrintWriter not open
相关文章:

Java Catching and Handling Exceptions(二)
一、Try with resources语句 try with resources语句是声明一个或多个资源的try语句。资源是程序使用完后必须关闭的对象。try with resources语句确保在语句末尾关闭每个资源。任何实现java.lang.AutoCloseable的对象(包括实现java.io.Closeable的所有对象&#x…...

【HarmonyOS开发】ArkTs关系型和非关系型数据库的存储封装
前面使用了首选项的存储方式,因此将其他的两种存储方式(键值型数据库和关系型数据库)也学习一下,简单记录一下,并进行封装,方便后续使用。 1、效果预览 2、使用条件 2.1 键值型数据库 键值型数据库实现数据…...
Latex编译出来的pdf文件缺少参考文献和交叉引用
参考文件通常需要在首次编译后,再次编译添加 依次执行下面的命令即可: xelatex main.tex main.tex为需要编译的主tex文件 biber mainxelatex main.tex 如果编译过程中遇到错误,请删除所有辅助文件和已打开的pdf文件后重试 辅助文件包括&#…...

sql_lab靶场搭建以及存在的一些问题
sql_lab靶场搭建问题 首先检查小皮版本 把小皮改到5.3.29版本如果没有可以直接点击更多版本进行选择安装 当版本不对时则会暴出这种错误 SETTING UP THE DATABASE SCHEMA AND POPULATING DATA IN TABLES: Fatal error: Uncaught Error: Call to undefined function mysql_co…...
Https接口调用问题
使用场景: 因为项目需要爬点接口数据, 接口是https, 在网上找的笔记整理了一下. 仅供参考 1. 调用Https的Get方法 /*** 只需要url** param url* return*/public static String doGetForHTML(String url) {return doGetForHTML(url, null);}/*** param url 请求地址* para…...

CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem:大屏高宽自适应问题
前言 继上篇《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem》。 发现一个有趣的问题,文件 rem.js 中按照宽度设置自适应,适用于大多数页面,但当遇到大屏就不那么合适了。 问题 使用宽度,注意代码第2 和 4 行:…...

SQL面试题挑战01:打折日期交叉问题
目录 问题:SQL解答:第一种方式:第二种方式: 问题: 如下为某平台的商品促销数据,字段含义分别为品牌名称、打折开始日期、打折结束日期,现在要计算每个品牌的打折销售天数(注意其中的…...

三大主流前端框架介绍及选型
在前端项目中,可以借助某些框架(如React、Vue、Angular等)来实现组件化开发,使代码更容易复用。此时,一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成,而是按照组件的思想将网页划分成一个个组…...

云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践
导语 由 InfoQ 主办的 Qcon 全球软件开发者大会北京站上周已精彩落幕,腾讯云中间件团队的冉小龙参与了《云原生机构设计与音视频技术应用》专题,带来了以《云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践》为主题的精彩演讲,在本…...

【LeetCode刷题】--245.最短单词距离III
245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…...

数字化时代的智能支持:亚马逊云科技轻量应用服务器技术领先
轻量应用服务器是一种简化运维、门槛低的弹性服务器,它的"轻"主要体现在几个方面:开箱即用、应用优质、上手简洁、投入划算、运维简便以及稳定可靠。相较于普通的云服务器,轻量应用服务器简化了云服务的操作难度、使用和管理流程&a…...

【智慧之窗】AI驱动产品探索
一.初识 ChatGPT ChatGPT 是由 OpenAI 开发的自然语言处理(NLP)模型,基于 GPT(Generative Pre-trained Transformer)架构。GPT 系列的模型旨在理解和生成自然语言文本。ChatGPT 专注于支持对话性任务,即与…...

BBS项目--登录
BBS阶段性测试总要求 django登录报错 Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。 原因分析:出现这种情况在Windows中很常见,就是端口被占用 解决措施:这时我们只需改一下端口便可以了 登录前端页面(HTML…...

Python---TCP服务端程序开发
1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象绑定端口号设置监听等待接受客户端的连接请求接收数据发送数据关闭套接字 2. socket 类的介绍 导入 socket 模块import socket 创建服务端 socket 对象socket.socket(AddressFamily, Type) 参数说明: AddressF…...

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)
回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图) 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图&#…...

听GPT 讲Rust源代码--src/tools(15)
File: rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs 在Rust源代码中,rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs文件的作用是实现了一个能够将输入的文本映射为标记的结构。具体来说,它定义和实现了几个结构体(…...

python可以做小程序研发嘛,python能做微信小程序吗
大家好,给大家分享一下python可以做微信小程序开发吗,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下用python代码…...
创建型模式 | 单例模式
一、单例模式 单例模式(Singleton Pattern),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例被构造,并提供一个访问它的全局访问接口,该实例被程序的所有模块共享。 1、饿汉式 1.1、基础版本 在程序启动后立刻构造单例࿰…...
【无标题】欢迎使用Markdown编辑器
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

Postgresql中PL/pgSQL的游标、自定义函数、存储过程的使用
场景 Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句: Postgresql中PL/pgSQL代码块的语法与使用-声明与赋值、IF语句、CASE语句、循环语句-CSDN博客 上面讲了基本语法,下面记录游标、自定义函数、存储过程的使用。 …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...