Java中异常的优雅处理方式

工作当中经常遇到程序跑异常的问题,而优雅处理异常则是高质量代码的关键。本文将深入讨论Java中异常的优雅处理方式,通过代码示例和实际使用场景进行详细说明,帮助大家更好地理解和应用异常处理机制。

1. 异常处理基础

在Java中,异常分为可检查异常(Checked Exception)和不可检查异常(Unchecked Exception)。可检查异常通常是在编译时被检查的,开发者必须显式地处理或声明抛出;而不可检查异常通常是运行时异常,不要求强制处理。

// 可检查异常的处理
try {// 可能抛出IOException的代码Files.readAllLines(Paths.get("example.txt"));
} catch (IOException e) {// 处理IOException,或者抛出新的异常e.printStackTrace();
}// 不可检查异常的处理
try {// 可能抛出NullPointerException的代码String str = null;int length = str.length();
} catch (NullPointerException e) {// 处理NullPointerException,或者抛出新的异常e.printStackTrace();
}

2. 优雅处理方式

2.1 使用try-with-resources

对于需要关闭资源的代码块,使用try-with-resources语句可以保证资源被及时释放,而无需显式地在finally块中关闭。

try (FileInputStream fis = new FileInputStream("example.txt");InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr)) {// 读取文件内容String line;while ((line = br.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {// 处理IOExceptione.printStackTrace();
}

2.2 自定义异常类

为了更好地区分不同的异常情况,可以定义自己的异常类,继承自ExceptionRuntimeException

// 自定义异常类
class CustomException extends RuntimeException {public CustomException(String message) {super(message);}
}// 使用自定义异常
try {// 可能抛出CustomException的代码throw new CustomException("This is a custom exception.");
} catch (CustomException e) {// 处理CustomExceptione.printStackTrace();
}

2.3 异常链与异常传递

在捕获异常时,可以通过将当前异常传递给新的异常来保留原始异常的信息,形成异常链,有助于排查问题。

try {// 可能抛出IOException的代码Files.readAllLines(Paths.get("example.txt"));
} catch (IOException e) {// 将IOException包装成新的RuntimeException,并传递原始异常throw new RuntimeException("Error reading file", e);
}

2.4 使用日志记录异常信息

在捕获异常时,使用日志记录异常信息而不是简单地打印到控制台,有助于在生产环境中更好地定位问题。

try {// 可能抛出IOException的代码Files.readAllLines(Paths.get("example.txt"));
} catch (IOException e) {// 使用日志记录异常信息log.error("Error reading file", e);
}

2.5 异常处理最佳实践

  • 不要捕获所有异常:只捕获你能够处理的异常,对于无法处理的异常,最好让它们上抛到更高层,由更高层的代码来处理。

  • 避免空的catch块:空的catch块会让调试和排查问题变得困难,至少应该记录异常信息。

  • 考虑异常的后果:在处理异常时,考虑异常的后果,并根据实际情况选择合适的处理方式。

3. 实际场景示例

3.1 文件读取

public String readFile(String filePath) {try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {// 读取文件内容并返回StringBuilder content = new StringBuilder();String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}return content.toString();} catch (IOException e) {// 处理文件读取异常log.error("Error reading file", e);return "Error reading file";}
}

3.2 数据库操作

public void updateUser(User user) {try {userRepository.update(user);} catch (DataAccessException e) {// 处理数据库操作异常log.error("Error updating user in the database", e);throw new ServiceException("Unable to update user", e);}
}

3.3 网络请求

public String fetchDataFromApi(String apiUrl) {try {// 发送HTTP请求并获取响应return httpClient.sendGetRequest(apiUrl);} catch (HttpTimeoutException e) {// 处理超时异常log.warn("HTTP request timeout", e);return "Request timeout";} catch (HttpException e) {// 处理其他HTTP异常log.error("HTTP request failed", e);throw new ServiceException("Failed to fetch data from API", e);}
}

4. 总结

Java中异常的优雅处理是编写高质量、可维护代码的重要方面。通过使用try-with-resources、自定义异常类、异常链与传递、日志记录等方式,可以更好地处理各种异常情况。在实际应用中,结合具体场景,选择合适的异常处理方式,有助于提高代码的稳定性和可读性。在编写代码时,建议谨慎捕获异常,考虑异常的后果,以及遵循异常处理的最佳实践。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)

List列表组件,是一个非常常用的组件。可以说在一个应用中,它的身影无处不在。它包含一系列相同宽度的列表项,适合连续、多行呈现同类数据,如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表(…

某国有企业后备人才培养机制建设

某电力勘测设计院始建于1958年,是中国电力建设集团有限公司旗下的大型电力工程咨询公司。伴随着中国电力事业的发展,已发展为具备甲级电力工程规划、咨询、勘测、设计、总承包、环境及安全管理评价、地质灾害勘察、评估与治理、光电建筑一体化及发电专项…

大数据学习之Flink算子、了解DataStream API(基础篇一)

DataStream API (基础篇) 注: 本文只涉及DataStream 原因:随着大数据和流式计算需求的增长,处理实时数据流变得越来越重要。因此,DataStream由于其处理实时数据流的特性和能力,逐渐替代了DataSe…

Windows下安装达梦8开发版数据库

达梦数据库属于国产主流数据库之一,本文记录WIndows下安装最新的达梦8数据库的过程。   达梦官网(参考文献1)下载开发版(X86平台)版安装包,如下图所示: 解压安装包后,其中包含ISO文…

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的,之前有想过RenderTexture来实现,不过使用RenderTexture不适合用于很多个特效,因为RenderTexture依赖Camera的照射,如果在背包中每种道具都有不同的特效,那使用RenderTexture则需要…

Vue3+Vite+Cesium项目开发心得(实时更新)

之前就想写的,纯属个人习惯总结,欢迎订正! Cesium相关 1. Cesium包的引入,我还是建议直接放到public下面,html里直接加script标签的形式; 2. Vue的响应式不要挂接任何Cesium创建的任何对象,尤…

Armv8-M的TrustZone技术之SAU寄存器总结

每个SAU寄存器是32位宽。下表显示了SAU寄存器概要。 5.1 SAU_CTRL register SAU_CTRL寄存器的特征如下图和表所示: 5.2 SAU_TYPE register 5.3 SAU_RNR register 5.4 SAU_RBAR register 5.5 SAU_RLAR register 5.6 SAU区域配置 当SAU启用时,未由已启用…

【技术】SpringBoot 接口怎么加密解密

1. 介绍 在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用 如果我们想保证数据传输的安全,对接口出参加密,入参解密。 但是不想写重复代码,我们可以提供一个通用starter,提…

服务器部署模型访问前端页面

如果你在学校服务器上部署了一个模型,此时他给了你一个url:0.0.0.0:2222,这个时候该如何访问呢? 其实很简单,但是自己弄错了,所以弄了很久。记录一下,自用。 以下ip地址是假的,仅供记录一下。…

go 依赖注入设计与实现

在现代的 web 框架里面,基本都有实现了依赖注入的功能,可以让我们很方便地对应用的依赖进行管理,同时免去在各个地方 new 对象的麻烦。比如 Laravel 里面的 Application,又或者 Java 的 Spring 框架也自带依赖注入功能。 今天我们…

C++高精度问题

高精度前言 C中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。 高精度总体思路 由于int和long long的限制,我们要想存放很长的数就需…

Power Apps 向Power Automate传一个数组参数

Power Apps传Power Automate数组参数 背景Power Apps传参方法画布开发我们现在power apps中设置一个集合**ArrCollect**准备一个按钮 Power Automate接收总结画布流 背景 我们通常会从Power Apps界面传递参数给Flow中,但是很多时候仅仅是一个字符串类型的已经不适用…

二进制计算

二进制的引入 十进制规则:满10进1,由数字0到9组成。 而所谓十六进制,八进制,二进制的规则也是类似。 这里为了区分十六进制和八进制,十六进制前面会加上0x,八进制前面会加个0作为区分 而二进制的规则类似于十进制&…

openssl3.2/test/certs - 025 - client intermediate ca: cca-cert

文章目录 openssl3.2/test/certs - 025 - client intermediate ca: cca-cert概述笔记END openssl3.2/test/certs - 025 - client intermediate ca: cca-cert 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_linux_log_doc_025.txt // \note open…

PLC协议转BACnet网关BA107

随着通讯技术和控制技术的发展,为了实现楼宇的高效、智能化管理,集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下,高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生,广泛应用于楼宇自控和暖通空调系统应用中…

精品基于Uniapp+springboot智能家居环境检测App

《[含文档PPT源码等]精品基于Uniappspringboot智能家居环境检测App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:Java 后台框架:springboot、ssm …

HTTP3/QUIC 性能测试与配套组件

背景 最近一年很多关于QUIC的文章层出,但是发现一个问题,这些文章都是在介绍QUIC或HTTP3是怎样的一个东西,以及它的优点和机制,将它夸的近乎上天了。然而有心的人估计会亲手做一些测试,就会发现这个被捧上天的东西性能…

宝塔+nextcloud+docker+Onlyoffice 全开启https

折腾了我三天的经验分享 1.宝塔创建网站 nextcloud版本为28.0.1 php8.2 ,导入nextcloud绑定域名对应的证书 ,不用创建mysql 因为nextcloud 要求是mariadb:10.7 宝塔里没有,就用docker安装一个 端口设置为3307 将数据库文件映射出来/ww…

Leetcode刷题(二十八)

找出字符串中第一个匹配项的下标(Easy) 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返…

基于springboot+vue的“衣依”服装销售平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…