当前位置: 首页 > news >正文

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

前言

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我都加上日志,那么一定不会错过。

在这里插入图片描述


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

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

相关文章:

  • 六 游戏基础知识和SHAPE
  • 【传输层】概述、复用分用、UDP详解、UDP校验
  • Redis基础学习
  • [附源码]Python计算机毕业设计Django学生宿舍管理系统
  • 51单片机——IO拓展(串转并)-74HC595 小白详解
  • 电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)(Matlab代码实现)
  • Apache服务深入学习篇(详细介绍)
  • ICV:2022年中国车载摄像头市场规模有望突破50亿美元大关
  • 适老化产品开发:用科技和智能解决老龄化难题
  • ORB-SLAM2 ---- Tracking::TrackWithMotionModel函数
  • 兄弟机床联网
  • Stable Diffusion模型阅读笔记
  • Maven插件开发
  • 【论文复现】——基于逐点前进法的点云数据精简
  • 微服务框架 SpringCloud微服务架构 22 DSL 查询语法 22.1 DSL 查询分类和基本语法
  • Fairseq代码结构
  • [安装] Doris集群搭建环境
  • 【JavaScript】——JS数组的方法(全且详细)
  • GoWeb 进阶的实战项目,基于 Iris 框架实现 JWT 认证(附案例全代码)
  • MySQL数据库 —— 常用语句
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉