关于java异常的整理

news2024/9/23 15:33:09

文章目录

  • 一、异常分类
  • 二、throw、throws、try-catch-finally
  • 三、CglibAopProxy中对异常的处理
  • 4、关于UndeclaredThrowableException

一、异常分类

java异常层级结构

  • Throwable:所有异常的根接口
    • Error:严重错误,程序无法处理和恢复
      • 例如VirtualMachineError,OOMError等
    • Exception:异常,程序可以捕获并可能恢复
      • RuntimeException: 运行时异常,无需强制捕获
        • NullPointerException
        • ClassCastException
        • ArithmeticException
        • IllegalArgumentException
      • IOException: IO操作异常
        • FileNotFoundException
        • SocketException
      • SQLException: SQL数据库访问异常
      • TimeoutException: 超时异常
      • ParseException: 解析错误异常
      • OtherException: 其他领域特定的异常
        • HttpException
        • ASFException
      • 自定义Exception:用户自定义的业务异常

从另一个角度看java异常分为Checked Exception和Unchecked Exception

  • Checked Exception: 需要捕获或者声明抛出的异常,如果没有处理则不能编译通过。主要包括Exception及其子类,不包括RuntimeException。例如IOException、SQLException等。
  • Unchecked Exception: 不需要强制捕获的异常,可以不处理。主要包括RuntimeException及其子类。例如NullPointerException、ClassCastException等

Checked Exception举例:

public class Test{
    public static void main(String[] args) throws IllegalAccessException {
        int a = new Random().nextInt(10);
        System.out.println(a);
        if(a % 2 == 1){
            throw new IllegalAccessException("This is an checked exception.");
        }
    }
}

这里如果不声明(throws)或捕获(try-catch)异常编译会报错

在这里插入图片描述
加上throws IllegalAccessException编译通过,运行结果如下
在这里插入图片描述

Unchecked Exception举例:

public class Test {
    public static void main(String[] args){
        int a = new Random().nextInt(10);
        System.out.println(a);
        if(a % 2 == 1){
            throw new IllegalArgumentException("This is an unchecked exception.");
        }
    }
}

这里没有throws或try-catch编译通过
在这里插入图片描述
运行结果如下
在这里插入图片描述
ps::注意上面例子上两种异常(IllegalAccessException和IllegalArgumentException),不要看错了

二、throw、throws、try-catch-finally

  • throw: 用于抛出一个异常对象,通常在方法体内使用。

例如:

throw new IOException("文件读取错误");
  • throws: 声明一个方法可能抛出的异常类型,出现在方法签名中。

例如:

public void readFile(String file) throws IOException {
  // 方法实现
}
  • try-catch-finally: 用于捕获异常,try代码块表示需要捕获异常的代码,catch表示捕获到异常后的处理逻辑,finally表示需要额外处理的逻辑
    finally中的内容是一定会执行的,无论有没有捕获异常。常用于关闭IO流等做一些收尾操作。

例如:

try {
  readFile(file); 
} catch (IOException e) {
  // 处理IO异常
} finally {
  // 额外逻辑
}

三、CglibAopProxy中对异常的处理

在CglibAopProxy中有一个内部类CglibMethodInvocation,而CglibMethodInvocation中的proceed()方法对捕获的异常做了一个逻辑处理

        @Nullable
        public Object proceed() throws Throwable {
            try {
                return super.proceed();
            } catch (RuntimeException var2) {
            	// RuntimeException或其子类直接抛出 ---- 1
                throw var2;
            } catch (Exception var3) {
            	// 非RunTimeException需根据Cglib代理的方法抛出的异常判断 ---- 2
            	// 是代理方法抛出的异常或该异常的子类则 ---- 3
            	// 若不是则抛出UndeclaredThrowableException异常 ---- 4
                if (!ReflectionUtils.declaresException(this.getMethod(), var3.getClass()) && !KotlinDetector.isKotlinType(this.getMethod().getDeclaringClass())) {
                    throw new UndeclaredThrowableException(var3);
                } else {
                    throw var3;
                }
            }
        }

上述代码2、3、4实现主要由if语句条件中ReflectionUtils.declaresException()方法实现
方法参数:
Method method:代理的方法
Class<?> exceptionType:抛出的异常(不是代理方法抛出的),这里是aop中抛出的IllegalAccessException

    public static boolean declaresException(Method method, Class<?> exceptionType) {
        Assert.notNull(method, "Method must not be null");
        // 获取代理方法中抛出的异常类型
        Class<?>[] declaredExceptions = method.getExceptionTypes();
        Class[] var3 = declaredExceptions;
        int var4 = declaredExceptions.length;
		
		// 判断捕获的异常是否是代理方法抛出的异常或该异常子类
        for(int var5 = 0; var5 < var4; ++var5) {
            Class<?> declaredException = var3[var5];
            if (declaredException.isAssignableFrom(exceptionType)) {
                return true;
            }
        }

        return false;
    }

举例说明:
这里自定义注解+aop切面增强某个controller方法时抛出了IllegalAccessException异常
在这里插入图片描述
controller中并未throws任何异常
在这里插入图片描述
运行结果
在这里插入图片描述
返回给前端的结果也是这个,并没有返回我们写的IllegalAccessException
打断点调试
先走到CglibAopProxy这
因为IllegalAccessException不是RuntimeException的子类,所以走到了if条件语句这
在这里插入图片描述
进入到ReflectionUtils.declaresException()方法
在这里插入图片描述
查看控制台debug的内容可知他从method中获取的异常类型
在这里插入图片描述
可见是没有获取到任何异常的,因为上面controller中并未手动抛出任何异常
所以最后ReflectionUtils.declaresException(this.getMethod(), var3.getClass())返回的结果是false
抛出UndeclaredThrowableException异常
看名字能知道这个异常的意思是未声明的异常

4、关于UndeclaredThrowableException

一文搞懂 UndeclaredThrowableException

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

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

相关文章

React相关学习导引

目录 扩展学习资料 什么是React&#xff1f; 什么是Component 组件树结构 虚拟dom 为何要选React 选择React React生态 为何选择React 学习目录 思考一下~ 扩展学习资料 Awsome React知识体系 https://github.com/enaqx/awesome-react 了解React生态&#xff0c…

外边距合并可能产生的问题

外边距合并可能产生的问题&#xff0c;可能会出现合并和塌陷问题 1、这种现象&#xff0c;先要准备两个盒子&#xff1a; 2、 父元素往下走了20px 3、让孩子也走一走 4、父元素和子元素同时存在了margin的情况&#xff0c;就会出现塌陷的情况产生&#xff0c;不能都使用margin:…

SPINN:基于设备和云的神经网络协同递进推理

SPINN&#xff1a;基于设备和云的神经网络协同递进推理 论文标题&#xff1a;SPINN: synergistic progressive inference of neural networks over device and cloud 原文链接&#xff1a;https://dl.acm.org/doi/10.1145/3372224.3419194 论文动机 现代CNN过多的计算需求&am…

【数据分享】2000-2022年1km精度人口分布栅格数据(免费获取/全球/全国/分省/分市)

人口空间分布数据是我们在各项研究中经常使用的数据&#xff0c;之前我们给大家分享过2000-2021年来自LandScan平台的1km精度的人口分布栅格数据集。LandScan人口数据集由美国能源部橡树岭国家实验室&#xff08;ORNL&#xff09;开发&#xff0c;East View Cartographic提供。…

1980-2020中国土地利用现状遥感监测数据(数据格式:shp)

LUCC分类体系 一级类型二级类型编号名称编号名称含义1耕地––指种植农作物的土地&#xff0c;包括熟耕地、新开荒地、休闲地、轮歇地、草田轮作物地&#xff1b;以种植农作物为主的农果、农桑、农林用地&#xff1b;耕种三年以上的滩地和海涂。––11水田指有水源保证和灌溉设…

HDFS中的NAMENODE元数据管理(超详细)

元数据管理 元数据是什么元数据管理概述内存元数据元数据文件fsimage内存镜像文件edits log编辑日志 namenode加载元数据文件顺序 元数据管理相关目录文件元数据相关文件VERSIONseen_txid 元数据文件查看&#xff08;OIV,OEV&#xff09;SecondaryNameNode介绍checkpoint机制SN…

SynergyNet(头部姿态估计 Head Pose Estimation)复现 demo测试

目录 0 相关资料1 环境搭建2 安装 SynergyNet3 下载相关文件4 编译5 测试 0 相关资料 SynergyNet&#xff08;github&#xff09;&#xff1a;https://github.com/choyingw/SynergyNet 1 环境搭建 我用的AutoDL平台搭建 选择镜像 PyTorch 1.9.0 Python 3.8(ubuntu18.04) Cu…

2.Flink应用

2.1 数据流 DataStream&#xff1a;DataStream是Flink数据流的核心抽象&#xff0c;其上定义了对数据流的一系列操作DataStreamSource&#xff1a;DataStreamSource 是 DataStream 的 起 点 &#xff0c; DataStreamSource 在StreamExecutionEnvironment 中 创 建 &#xff0c;…

Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明

目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 介绍 恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积…

【数据结构和算法】排序算法

说明&#xff1a;以下排序如无特别说明&#xff0c;都是从小到大升序排序 1. 冒泡排序 核心思想&#xff1a;每个元素与其相邻元素比较&#xff0c;如果前者大于后者则交换&#xff0c;每次循环结束后会将最大值放到最后&#xff0c;像小水泡从底下冒到上面成大水泡一样&…

选择结构的学习

选择结构 思考以下问题&#xff1a; 常用的逻辑运算符及其作用&#xff1f; 请写出判断分数大于 60 并且分数小于 100 的表达式 if-else 选择结构执行的顺序是什么&#xff1f; 多重 if 选择结构的执行流程是怎样的&#xff1f; if 选择结构书写规范有哪些&#xff1f; 通过下…

SAP通过 SWO3找一些不在事务码BAPI里面的BAPI

找BAPI BAPI_SALESDOCUMENT_COPY 首先事务码BAPI: 下面的所有方法都找不到&#xff08;随便点开一个&#xff09; 进SWO3 双击进去&#xff0c;继续往下点&#xff0c;找到了

学习左耳听风栏目90天——第一天 1-90(学习左耳朵耗子的工匠精神,对技术的热爱)【洞悉技术的本质,享受科技的乐趣】

洞悉技术的本质&#xff0c;享受科技的乐趣 第一篇&#xff0c;我的感受就是 耗叔是一个热爱技术&#xff0c;可以通过代码找到快乐的技术人。 作为it从业者&#xff0c;我们如何可以通过代码找到快乐呢&#xff1f;这是一个问题&#xff1f; 至少目前&#xff0c;我还没有这种…

调试技巧(2)

6. 如何写出好&#xff08;易于调试&#xff09;的代码 6.1 优秀的代码&#xff1a; 代码运行正常bug很少效率高可读性高可维护性高注释清晰文档齐全 常见的coding技巧&#xff1a; 使用assert尽量使用const养成良好的编码风格添加必要的注释避免编码的陷阱。 这里讲一下assert…

python中计算2的32次方减1,python怎么算2的3次方

大家好&#xff0c;给大家分享一下怎么样用python编写2的n次方,n由键盘输入&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; ---恢复内容开始--- 1、内置函数&#xff1a;取绝对值函数abs() 2、内置函数&#xff1a;取最大值max()&#xff…

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)&#xff1f; ❤️‍&#x1f525; 前面已经解释了什么是算法&#xff1f; 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题&#xff0c;我们往往有很多种解决思路和方法&#x…

url重定向

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。 如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话 就可能发生"跳错对象"的问题。 url跳转比较直接的危害是…

【网络工程】网络流量分析工具 Wireshark

文章目录 第一章&#xff1a;WireShark介绍第二章&#xff1a;WireShark应用第三章&#xff1a;Wireshark 实战 第一章&#xff1a;WireShark介绍 Wireshark (前身 Ethereal)&#xff1a;它是一个强大的网络包分析工具 ! 此工具主要是用来捕获网络数据包的&#xff0c;并且自动…

CBCGPRibbon 添加背景图片

resource.h中声明资源的ID&#xff1a;ID_RIBBON_BACKIMAGE rc文件中添加png图片路径&#xff1a; ID_RIBBON_BACKIMAGE PNG DISCARDABLE "res\\bkribbon.png" 代码中添加下测&#xff1a; //添加背景图片 m_wndRibbonBar.SetBackgroundImage(ID_RIB…

Redis 总结【6.0版本的】

如果源码不编译&#xff0c;是无法实现自动跳转的&#xff0c; Redis在win上编译有点麻烦&#xff0c;我是使用的CentOS环境&#xff0c;Clion编译 编译完就可以直接通过shell连接Redis server了 server.c 中放的是就是主类 &#xff1a;6000多行左右是入口main()函数位置 Red…