首页 > 编程语言 >分享一个你很可能不知道的Java异常实现的缺陷

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

时间:2022-12-07 11:22:42浏览次数:39  
标签:分享 Java 抛出 finally catch 缺陷 异常

前言

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

在这里插入图片描述


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

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

标签:分享,Java,抛出,finally,catch,缺陷,异常
From: https://www.cnblogs.com/fulongyuanjushi/p/16961557.html

相关文章

  • Java—Google guava工具类(高效)快速入门指南
    Java—Googleguava工具类(高效)快速入门指南Googleguava工具类特点Guava是对JavaAPI的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava......
  • Java—oshi获取主机运行信息
    Java—oshi获取主机运行信息在该监控系统中,想要做到主机的CPU、内存、磁盘、网络、线程、JVM内存、JVMGC等维度的监控,JVM方面的监控还好说,直接用JMX做就行了,关键是......
  • Java—bouncycastle支持国密SM2的公钥加密算法
    Java—bouncycastle支持国密SM2的公钥加密算法java代码是依赖BouncyCastle类库,经修改此类库中的 SM2Engin 类的原码而来,用于支持SM2公钥加密算法,符合:《GM/T000......
  • (Java跳蚤网/IT枫斗者)详细步骤Jdk16下载安装与环境变量配置
    一:首先去官网下载Jdk如下地址复制到浏览器。1、下载地址:​​https://www.oracle.com/java/technologies/javase-jdk16-downloads.html​​2、点击下载,下载完了之后双击它。......
  • (Java跳蚤网/IT枫斗者)详细步骤Jdk16下载安装与环境变量配置
    一:首先去官网下载Jdk如下地址复制到浏览器。1、下载地址:​​https://www.oracle.com/java/technologies/javase-jdk16-downloads.html​​2、点击下载,下载完了之后双击它。......
  • Java 枚举(enum) 详解7种常见的用法
    Java枚举(enum)详解7种常见的用法常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了......
  • Java8的Stream流如此强大,你知道它的原理吗
    ......
  • javaScript_01_按照key排序
     javaScript_01_按照key排序前言Object.keys()与Objetc.values()实现按key排序前言最近做一个小程序项目需要用到腾讯地图的api,在计算sig的时候需要将参数按照......
  • java基础之数据类型转换
    一简介1.Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。由低到高:byte,short,char——int——long——float——double二转换类型1.强制转换由高到低......
  • Java基础7-(练习题,Debug)
    Java基础7-(练习题,Debug)习题:数组遍历需求:设计一个方法用于数组遍历,要求遍历结果在一行上,例如[11,22,33,44,55]数组求值需求:设计方法,输出数组的最大,最小,总和......