分享一个你很可能不知道的Java异常实现的缺陷

news2024/9/23 21:24:17

前言

Java中一个大家熟知的知识点就是异常捕获,try…catch…finally组合,但是很多人不知道这里面有一个关于Java的缺陷,或者说是异常实现的一点不足之处。

我这边就通过一个很简单的实验给大家演示下效果玩玩儿,希望大家能觉得有趣。

模拟

1、自定义异常

这里,我们首先写一个自定义业务异常,专门用来抛出。

在这里插入图片描述

2、模拟异常

然后,我们写个测试方法来捕获并抛出空指针异常。

在这里插入图片描述

看下效果,OK没问题。

在这里插入图片描述

接下来,我们加上finally看看。

在这里插入图片描述

看下效果,OK也没问题。

在这里插入图片描述

接下来我们这么做,在finally中抛出一个异常。

在这里插入图片描述

看下效果,发现catch的异常竟然被覆盖了。

在这里插入图片描述

虽然这种场景很特殊,但这其实就是Java在异常实现上美中不足的地方,因为异常是作为程序出错的标志绝对不应忽略,可是这种场景下异常的的确确丢失了。

接下来,我们再测试一种情况,在finally中使用return,看看会发生什么。

在这里插入图片描述

看看效果,发现catch中捕获的异常干脆直接没了,仿佛从没来过。

在这里插入图片描述

最后,我们再演示一种你可能工作中干过或者见过的莫名其妙的事情。

我们修改一下这个测试方法,看代码。

在这里插入图片描述

简单描述一下,你调用其他类的一个查询方法,那个方法可能习惯性的try…catch…finally了,而finally中还做了一些末尾必须要执行的操作,这个业务逻辑处理可能有几十行,你很可能又习惯性的做了一些判断以及异常的抛出。

别不相信,当一个项目进入中期甚至赶进度的时候,方法套方法,不少人已经在机械的茫然的写代码,也可能是在别人的基础上改代码,你很可能不会太仔细地一行一行去看那些代码里究竟有什么,恰巧测试的时候也没出什么大问题。

那么结果可能就是下面这样,你会发现自己一开始特意抛出的那个捕获该查询方法异常的玩意儿没一点效果,也不知道去哪儿了,怎么找也找不到,不知从哪儿冒出来下面这个莫名其妙的异常,后来想不到也就算了。

在这里插入图片描述

原因

这其实就是Java异常实现的一个不足,异常是程序出错的标志,怎么都不应该被忽略掉,更不用说是finally这种常用的行为,直接或间接地造成了异常的丢失。

《Thinking In Java》的作者有明确指出这个异常,认为这是相当严重的缺陷,是一个可能造成异常完全丢失的缺陷,而且是以一种更微妙、更难以察觉的方式在进行。

而C++就处理的很好,会将这种在第一个异常被处理之前抛出第二个异常的情况视为严重的编程错误。

总结

知道了这个缺陷后,其实就很好避免了。

1、避免在finally中抛出异常;

2、避免在finally中使用return;

3、catch中一定要养成log.error记录异常日志的好习惯,因为log是一定会记录下来的,至少不会让你毫无线索。

结尾再演示下加了日志的效果,只要是catch我都加上日志,那么一定不会错过。

在这里插入图片描述


原创文章纯手打,一个一个字敲出来的,键盘上全是血,如果觉得有帮助麻烦点个赞和收藏吧~

本人致力于分享工作中的经验及趣事,喜欢的话可以进主页关注一下哦~

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

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

相关文章

linux搭建测试环境(tomcat)

安装jdk 1,查看是否装的有(centos7会自带的有)如果是普通用户切记要切换到root 输入命令查看是否安装: java -version2,跟踪查看自带jdk 默认安装了openjdk,那就要知道具体文件安装到哪里了,这里我们可以通过命令“rp…

黑马程序员Java数据结构与java算法笔记(1)

数据结构和算法详细内容 来源:黑马程序员Java数据结构与java算法 1.数据结构和算法概述 1.1什么是数据结构? 数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据 1.2数据结构分类 传统上,我们可以把数…

跟我学Python图像处理丨图像分类原理与案例

摘要:本篇文章将分享图像分类原理,并介绍基于KNN、朴素贝叶斯算法的图像分类案例。本文分享自华为云社区《[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例丨【百变AI秀】》,作者:eastmount 。 一…

5-4:发送系统通知

触发事件 评论后,发布通知点赞后,发布通知关注后,发布通知。 处理事件 封装事件对象开发事件的生产者开发事件的消费者 消费者线程:从队列里读消息,并做处理; 生产者线程:往线程中存入数据&…

深度神经网络是什么意思,神经网络准确度只有50

1、研究人工神经网络的权值分布有什么意义 神经网络一般都是非常庞大的,每个边对应一个权值,如果权值不共享的话,数据量就更大了,但是为了提高效率,引入了权值共享,但是还不够,想再次提高效率和…

五、伊森商城 前端基础-Vue Vue脚手架创建 p26

目录 一、vue 模块化开发 1、全局安装 webpack 2、全局安装 vue 脚手架vue-cli 3、初始化 vue 项目 3.1、创建文件夹 3.2、初始化vue脚手架 3.3、项目结构 4、项目启动命令 拓展:创建超时 一、vue 模块化开发 打开终端,进行命令安装 1、全局安装…

Linux网络基础(初级)

Linux网络基础 文章目录Linux网络基础1.计算机网络的发展过程1.1 独立模式1.2 网络互联模式1.3 局域网 LAN1.4 广域网 WAN2.计算机网络协议2.1 协议的概念2.2 什么是网络协议2.3 什么是网络协议簇2.4 OSI 七层模型2.5 TCP/IP 五层模型3.网络传输基本流程3.1 同局域网内的两台主…

[附源码]计算机毕业设计拉勾教育课程管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

实例解析丨一文搞定GaussDB CM服务异常

摘要:本文主要为大家带来如何处理GaussDB CM服务异常问题。本文分享自华为云社区《【实例状态】GaussDB CM服务异常》,作者:酷哥。 首先确认是否是虚拟机、网络故障,底层故障处理 PID文件未清理导致进程启动失败 问题现象 收到…

FS2115D SOT23-6 低噪声3.3V升压IC电荷泵 DC/DC 转换器

概述 FS2115D 是一款低噪声、恒定频率 (1.2MHz) 开关电容倍压器。它从 1.8V 至 5V 输入产生一个稳定的输出电压,输出电流高达 150mA。FS2115D 的外部元件数量少(VIN 和 VOUT 处有一个跨接电容器和两个小型旁路电容器)…

程序员看世界杯

目录 1、世界杯赛事规则 1.1、赛制 1.2、小组赛 1.3、淘汰赛阶段 1.4、1/8决赛 1.5、半决赛 1.6、决赛 2、大力神杯材质 3、看球心德 4、2022大力神杯赢家 1、世界杯赛事规则 1.1、赛制 世界杯一共进行64场,其中分小组赛48场,1/8决赛8场&am…

Sentinel--服务容错

目录一、高并发带来的问题二、服务雪崩效应三、常见容错方案四、Sentinel入门什么是Sentinel安装Sentinel控制台实现一个接口的限流五、Sentinel的概念和功能基本概念重要功能六、Sentinel规则流控规则简单配置配置流控模式配置流控效果降级规则热点规则授权规则系统规则自定义…

行为管理(锐捷行业网关篇)

大家好,我是小杜。有了自学习和师傅指导这个“buff”,感觉自己的进步是“一日千里”啊! 今天来学习网关产品的行为管理相关的配置,咦,网关EG系列和睿易的NBR-E系列的路由器差不多啊,难道是“双胞胎”&#…

安卓app源码和设计报告——简易记账本

课 程 设 计(实训)说 明 书 题目实现简易记账本功能 专 业班 级学生姓名同组学生指导老师课程设计(实训)评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语: 成绩: 优良中及格不及格出勤20%实…

ArrayList、LinkedList、HashMap

ArrayList 特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现的,数组在内存中是需要连续的存储单元的 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, ja…

计数问题

目录 B.计数问题 思路: 代码: 时间复杂度: 总结: 题目链接: B.计数问题 时间&#xff1a;1s 空间&#xff1a;128M 题目描述&#xff1a; 计算在区间 1 到 n 的所有整数中&#xff0c;数字 x(0 ≤ x ≤ 9)共出现了多少次&#xff1f;例如&#xff0c;在 1到 11中&…

阿里P9大牛整理总结出进阶架构师必备知识:NginxLua开发实战文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

基于遗传算法和非线性规划的函数寻优算法(Matlab代码实现)

目录 1 概述 1.1简介 1.2 遗传算法及其基本步骤 2 部分运行结果 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 现实生活中很多科学计算和工程问题都可以通过建模转化成求函数的优化问题&#xff0c;并求出函数模型在可行域内的最优解&#xff0c;给决策者提供参考。非线…

【AI学习笔记】Error: ffmpeg error (see stderr output for detail)

报错&#xff1a; 原因&#xff1a; 我询问了一下大佬&#xff0c;大佬说让我调试一下ffmpeg库&#xff0c;看本地能不能用&#xff0c;然后又结合了我查看的一些博文及本地环境&#xff0c;推论出我很可能没有配置环境。 由于我conda一个环境&#xff0c;本地一个python3.9环…

Vue按钮(Button)

可自定义设置以下属性&#xff1a; 按钮默认文本&#xff08;name&#xff09;,默认不设置时显示为按钮 按钮类型&#xff08;type&#xff09;&#xff0c;默认default&#xff0c;另外可选primary danger 按钮悬浮变化效果&#xff08;effect&#xff09;&#xff0c;只有t…