Java基础:异常与错误(ExceptionError)
1 缘起
某天上网冲浪时,偶然看到一个问题,说Java的Error和Exception有什么区别?
一句话:不知道。并不能很清晰地描述出个中区别。
当然,曾经也看过Throwable相关的知识,但是,并没有通过源码及注释描述深入了解,
之前都是看别人总结的知识,这次自己通过源码梳理,
还是有一些收获的,
分享如下,帮助读者轻松应对知识交流与考核。
2 Throwable
位置:java.lang.Throwable
Throwable类是Java语言中所有错误和异常的父类。
只有该类(或该类子类)的对象才能被JVM抛出或Java程序抛出。
同样,只有该类或该类的子类才能作为catch语句的参数类型。
Throwable类关系如下图所示。
为了编译时异常检查,Throwable和Throwable的任何子类(不是RuntimeException或Error的子类)都被视为已检查的异常。
源码如下图所示。
Error和Exception子类的实例常用于表示发生的异常。
一般,这些异常是在上下文中实时创建的,包含相关的信息(如堆栈跟踪数据)。
异常产生时,throwable对象包含:
(1)线程执行堆栈的快照;
(2)消息字符串,会提供更多的错误信息。throwable可以抑制其他throwable的传播;
(3)产生异常的原因:产生throwable的throwable,即链式传播路径,通过异常传播链排查产生异常的原因;
产生throwable的原因:
(1)抛出throwable的类构建在较低层的抽象上,上层操作的失败是因为较低层失败。让下层抛出throwable并向外传播是糟糕的设计,因为她通常与上层提供的抽象无关。并且,如果下层的异常已经检查,这样会将上层的API与实现的细节绑定到一起。抛出包装异常(如包含异常原因)允许上层将失败的详细信息传递给调用方则不会有上面的缺点。上层在不改变API基础上保留灵活修改实现(尤其是方法引起的异常)。
(2)抛出异常的方法符合通用接口(不允许方法直接抛出异常原因)。假设一个持久化集合符合Collection接口,持久化是在java.io上实现的。假设add方法内部可以抛出IOException,当Collection接口在未检查异常中包装了IOException,实现可以将IOException的详情传递给调用者(持久话集合的规范应表明它能够引发此类异常)。
异常原因可以通过两种方式与throwable关联:将原因作为参数的构造函数;通过initCause(Throwable)方法。
新的throwable类(希望异常原因与类相关联)应该提供具有异常原因的构造函数并且代理(可能是间接代理)Throwable带有异常原因参数的某个构造函数。initCause方法是public,因此可将异常原因与任何throwable相关联,如legacy throwable(他的实现先于异常链机制添加到Throwable)。
按照惯例,Throwable类及其子类有两个构造函数,一个是无参构造函数,一个接收String类型的参数,用于生成详情。
此外,这些子类(可能与异常原因相关联)应该有两个(及以上)构造函数,一个接收Throwable,一个接收String和Throwable。
2.1 Error
位置:java.lang.Error
Error是Throwable的子类,说明问题严重,不应由应用程序捕获。
此时只管抛出异常,无需在程序中捕获,即不使用catch捕获Error。
大多数这样的错误都是异常情况,ThreadDeath虽然是“正常”情况,但是,仍旧不应捕获(ThreadDeath是Error的子类)。
Error的任何子类都不需要声明throws语句来抛出方法运行时产生的异常,
因为这些错误是不应该发生的异常情况。也就是说,为了在编译时检查异常,Error和Error的子类均为视为未检查异常。
源码如下图所示。
2.1.1 IOError
位置:java.io.IOError
发生严重I/O错误时抛出。
源码如下图所示。
2.1.2 ThreadDeath
位置:java.lang.ThreadDeath
损坏的线程调用(已过时)Thread.stop方法时抛出ThreadDeath实例。
只有在异步终止后必须清理时,应用程序才需要捕获此类的实例。
如果ThreadDeath由方法捕获,需要重新抛出,确保线程真正“死亡”。
如果未捕获到ThreadDeath,顶级Error处理器不会打印消息。
ThreadDeath是Error的子类而不是Exception的子类,
因为许多应用程序都会捕获所有的Exception,然后丢弃。
源码如下图所示。
2.1.3 VirtualMachineError
位置:java.lang.VirtualMachineError
抛出该异常表示Java虚拟机已经损坏或资源不足,程序无法继续运行。
源码如下图所示。
2.2 Exception
位置:java.lang.Exception
Exception类及其子类是Throwable的一种形式,表示程序想要捕获的异常。
通过该异常信息,排查问题,解决问题,因此需要在程序中显式声明并捕获异常。
Exception类和非RuntimeException子类都是检查异常(受检异常),即编译时异常检查。
如果方法或构造函数的执行会引发异常并传播到方法或构造函数外,需要在方法或构造函数抛出语句中声明异常。
源码如下图所示。
2.2.1 IOException
位置:
该类表示发生了某种I/O异常。此类是产生失败或中断I/O操作的通用异常类。
源码如下图所示。
2.2.1.1 EOFException
位置:java.io.EOFException
EOFException类表示输入过程中意外到达文件尾部或流尾部。
该异常主要用于标识数据输入流到达流尾部。
需要注意的是,许多其他输入操作在流结束时返回特殊值,而不是抛出异常。
源码如下图所示。
2.2.1.2 FileNotFoundException
位置:java.io.FileNotFoundException
当指定路径名的文件不存在时,FileInputStream、FileOutputStream和RandomAccessFile构造函数会抛出该异常。
如果文件存在,但是由于某些原因无法访问,仍会抛出该异常,如编辑只读文件。
源码如下图所示。
2.2.1.3 InterruptedIOException
位置:java.io.InterruptedIOException
InterruptedIOException表示I/O操作中断。抛出InterruptedIOException表明输入或输出传输已终止,因为执行该传输的线程已经中断。
bytesTransferred字段表示中断前成功传输的字节数。
源码如下图所示。
2.2.1.4 ObjectStreamException
位置:java.io.ObjectStreamException
抽象类,对象流类异常类的父类。
源码如下图所示。
集成ObjectStreamException的子类有:InvalidClassException、InvalidObjectException等,
全部的子类如下图所示。
2.2.2 RuntimeException
位置:java.lang.RuntimeException
RuntimeException是Java虚拟机正常运行期间可以抛出的异常类的父类。
RuntimeException及其子类是未检查异常,如果未检查异常可以由方法或构造函数抛出并向外传播,
则无需在方法或构造函数的抛出语句中声明。
源码如下图所示。
java.lang包中继承RuntimeException的类有17个,如下图所示,
下面挑几个进行分享。
2.2.2.1 ArithmeticException
位置:java.lang.ArithmeticException
发生算术异常时抛出。如除数为0,(1/0)。
ArithmeticException对象可以由虚拟机构造,如虚拟机禁用压缩或堆栈不可写。
源码如下图所示。
2.2.2.2 IndexOutOfBoundsException
位置:java.lang.IndexOutOfBoundsException
抛出IndexOutOfBoundsException说明某种索引超出了范围(如数组、字符串或向量)。
应用程序可继承该类表示类似的异常,如ArrayIndexOutOfBoundsException类。
源码如下图所示。
2.2.2.3 NullPointerException
位置:java.lang.NullPointerException
在需要使用对象的地方使用了null,包括:
(1)调用null对象的方法;
(2)访问或变更null对象;
(3)获取null数组的长度;
(4)访问或变更null数据组内容;
(5)Throwable值抛出null;
应用程序可以抛出该类的实例表示非法使用null。
虚拟机可以构造NullPointerException对象,如虚拟机禁用压缩和堆栈追踪不可写。
源码如下图所示。
2.2.3 ReflectiveOperationException
位置:java.lang.ReflectiveOperationException
在核心反射中因反射操作抛出异常类的公共父类。
源码如下图所示。
继承ReflectiveOperationException的子类有6个,如下图所示。
下面挑几个分享一下。
2.2.3.1 ClassNotFoundException
位置:java.lang.ClassNotFoundException
从JDK1.4开始,ReflectiveOperationException被修改为符合通用异常链机制。
“加载类时引发的异常”可能是构建时引发的,通过getException()方法可以获取产生异常的原因,
当然也可以通过“遗留方法”Throwable.getCause()方法获取异常原因。
源码如下图所示。
2.2.3.2 NoSuchMethodException
位置:java.lang.NoSuchMethodException
无法获取某个方法时抛出的异常。
源码如下图所示。
3 小结
(1)Throwable是所有异常和错误的父类,即Exception和Error;Throwable包含线程执行的堆栈快照,错误消息以及产生异常的链式传播路径;
(2)Error是严重的错误(如JVM错误),不需要应用程序主动捕获,抛出即可;
(3)Exception是应用程序级别的异常(是编写的应用程序出现的异常),需要应用程序主动捕获,异常信息帮助开发者排查和解决问题;
(4)Exception常用的可分为三类:IOException、RuntimeException和ReflectiveOperationException。
Throwable完整相关类的关系如下图所示。
相关文章:
Java基础:异常与错误(ExceptionError)
1 缘起 某天上网冲浪时,偶然看到一个问题,说Java的Error和Exception有什么区别? 一句话:不知道。并不能很清晰地描述出个中区别。 当然,曾经也看过Throwable相关的知识,但是,并没有通过源码及注…...
VAmPI:一个包含了OWASP Top10漏洞的REST API安全学习平台
关于VAmPI VAmPI是一个包含了OWASP Top10漏洞的REST API安全学习平台,该平台基于Flask开发,该工具的主要目的是通过一个易受攻击的API来评估针对API安全检测工具的有效性,并帮助广大研究人员学习和了解API安全。 功能介绍 1、基于OWASP Top…...
springboot(6)之前端传递参数的方式 普通 集合 数组
实体类传递 首先我们在后端定义一个实体类,通过lombok插件重写 有参 无参 get set toString 方法, 然后前端发送数据,后端就会自动收到,然后属性填写 后端代码如下 AllArgsConstructor Data NoArgsConstructor public class role …...
redis分布式锁的演变过程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、直接添加Redis缓存二、使用setnx执行抢锁过程三、setnx获取锁+设置过期时间四、引入UUID解决误删锁问题五、引入Lua脚本来做删除六、对递归部分优化进行自旋七、添加自旋次数八、改为重入锁,使…...
leaflet 修改popup的样式,个性化弹窗(069)
第069个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中修改popup组件的样式,个性化弹窗。主要方法是更改css, 中增加custom-popup类名,style的样式要做穿透处理 >>>.具体方法请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实…...
注解ConfigurationProperties、EnableConfigurationProperties的用法
1 ConfigurationProperties ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置。这样的好处是将配置数据与JOPO进行转换,能够管理一个类别的所有配置信息&…...
自适应布局之淘宝无限适配+rem+微信rpx自适应
一、自适应布局 所谓前端适配,就是为了让移动设计稿在大部分的移动设备上看起来有一致的展示效果,目前比较流行的方法有两种。一种是强制meta viewport宽度为设计稿宽度,一种是使用rem自适应布局的flexible.js。 二、当前流行的移动端自适应…...
esxi不能识别不兼容网卡解决方案
相信很多网友在安装测试VMWARE Esxi 6.0的时候,总会遇到无法兼容网卡的情况,本人也是遇到了再组装的台式机上测试ESXI 6.0的时候,无法识别REALTEK RTL 8111E的情况。 找了很多网友提供的博客,方法是正确的,但是不够严…...
Sizeof与Strlen的区别与联系
16年写了很多 C 与 C 相关的文章,但是后面从事了 Android 开发,就全部删掉了,无意中发现了这篇由还存在草稿箱,索性就找回来吧,也是追忆当年学习的青葱岁月 Sizeof与Strlen的区别与联系 一、sizeof sizeof(…)是运算…...
力扣(LeetCode)413. 等差数列划分(2023.02.15)
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。 …...
蓝桥杯刷题——基础篇(一)
这部分题目,主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的,蓝桥杯与ACM考察内容甚至评测标准基本都一样,因此本训练计划提供完整的刷题顺序,循序渐进,提高代码量,巩固基础。因竞赛支持C语言、C、Java甚至…...
Java基础知识快速盘点(三)
一,构造器 创建一个类的方法时会调用该类的构造器 构造器,也叫构造方法 构造器是属于类的,对象不可调用 构造方法没有返回值类型 构造方法一般用public修饰,也可用private修饰,例如 public class Test {private T…...
vscode编程小插件之Doxygen和Better Align
一、插件Doxygen:配置相应文件、函数说明项。 1、扩展商店,搜索Doxygen,如下图1,安装。 图1 2、设置项中,选择扩展设置,如图2 图2 3、配置版本、作者邮箱、作者名称、日期格式等等,如图3 4、定义函数后&…...
指 针
1.指针指针的作用: 可以通过指针间接访问内存(可以通过指针的保存一个地址(指针--地址))内存编号是从0开始记录的,一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …...
安卓小游戏:俄罗斯方块
安卓小游戏:俄罗斯方块 前言 最近用安卓自定义view写了下飞机大战、贪吃蛇、小板弹球三个游戏,还是比较简单的,这几天又把俄罗斯方块还原了一下,写了一天,又摸鱼调试了两天,逻辑不是很难,但是…...
NC113 验证IP地址
验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1&#…...
珠宝企业如何利用私域实现业绩增长?
近年来私域的流量不断兴起,各行业都在做私域,所处行业不同,企业所采取的私域打法也会针对性地改变。而在珠宝行业,针对珠宝产品高价、低频的消费特点,企业又该如何搭建私域应对策略? 快鲸scrm系统整理了几…...
回收站清空了还能找回来吗?回收站恢复的4个方法(最全)
回收站作为一个数据回收的地方,可以保存已删除的文件很久,直到用户手动永久删除这些数据,这为用户避免了许多数据丢失的问题。但是回收站数据过多,难免会影响电脑的运行速度。为此,我们都会定期进行清理。 清理过程中…...
深度解析React性能优化API
性能优化一直是前端领域讨论的一个热门问题,但在平时沟通及code review过程中发现很多人对于React中性能优化理解很模糊,讲不清楚组件什么时候更新,为什么会更新,关于React性能优化的文章虽然比较多,但大多数都是在罗列…...
算法刷题打卡第91天:统计一个圆中点的数目
统计一个圆中点的数目 难度:中等 给你一个数组 points ,其中 points[i] [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries ,其中 queries[j] [xj, yj, rj] ,表…...
sentinel持久化方案
一.sentinel规则推送原理 1.原有内存规则存储原理 (1)dashborad中请求到服务器后,在controller中通过http把规则直接推送给client,client接收后把规则放入内存; 2.持久化推送规则原理 ![在这里插入代码片](https://img-blog.csdnimg.cn/1…...
软件项目进度安排与跟踪:关键路径的计算
在一个软件项目中,管理人员需要按时了解项目进度,制定项目计划,同时需要及时发现所遇到的问题,然后和团队成员制定解决方案,确保整个计划可以顺利的进行,因此项目进度安排与跟踪是项目管理中的一个重要环节…...
mac m2 处理器 iterm2 sz rz 出错/无限重试
mac m2 处理器 iterm2 sz rz 出错/无限重试 1、背景 apple m 系列处理器安装的 homebrew 跟 intel 处理器略有不同,其中安装目录的区别: m 系列处理器安装目录为 /usr/local/bin/homebrewintel 处理器安装目录为 /opt/homebrew 其中 m 系列处理器安装…...
Mysql 与 磁盘交互的过程
从之前的Mysql架构可以了解到,Mysql 客户端不是直接和磁盘打交道,我们在客户端输入的sql语句会被发送给服务端,服务端对sql语句进行解析、缓存等操作,然后再交由存储引擎去读写磁盘。这其实是从 C/S 的角度去了解Mysql。 站在OS的…...
Spring Cloud Gateway集成Nacos实现负载均衡
💡Nacas可以用于实现Spring Cloud Gateway中网关动态路由功能,也可以基于Nacos来实现对后端服务的负载均衡,前者利用Nacos配置中心功能,后者利用Nacos服务注册功能。接下来我们来看下Gateway集成Nacos实现负载均衡的架构图一. 环境…...
Excel图表教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Excel图表初学者教程 - 从简单和简单的步骤学习Excel图表从基本概念到高级概念,包括简介,创建图表,类型,柱形图,折线图,饼图,圆环图,条形图,面积图,…...
2023最新的接口自动化测试面试题
1、请结合你熟悉的项目,介绍一下你是怎么做测试的? -首先要自己熟悉项目,熟悉项目的需求、项目组织架构、项目研发接口等 -功能 接口 自动化 性能 是怎么处理的? -第一步: 进行需求分析,需求评审&#…...
AcWing语法基础课笔记 第一章 C++入门及简单的顺序结构
第一章 C入门及简单的顺序结构 编程是一种控制计算机的方式,和我们平时双击打开文件、关机、重启没有任何区别。 ———闫学灿 C中常用的变量类型 和所占字节大小 输出变量地址符: 软件环境 作业的评测与提交 在线练习地址:www.acwing.com …...
【并发编程】【2】进程与线程
并发编程 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管…...
MySQL获取当前时间的各种方式
1 获取当前完整时间1.1 now()函数select now();输出:2023-02-15 10:46:171.2 sysdate()函数select sysdate();输出:2023-02-15 10:47:131.3 current_timestamp或current_timestamp()current_timestamp和current_timestamp()函数的效果是一样的,只不过一个是关键字&a…...
python做网站好吗/搜索引擎优化有哪些要点
电脑能力主要看处理器和显卡。办公用途,平面设计类吃处理器的能力。游戏,3d设计类吃显卡能力。不管那种需求,内存容量都是需要有合理的选择(类如看机器是否支持扩展)。不管台式本子都一样。本子的能力和选择问题下面说法参考。~&a…...
四川高速公路建设集团网站/电商网站订烟
springspringMVCMybatis整合_XML配置示例 1.概述 springspringMVCMybatis整合 XML配置方式 1.1 测试环境说明 名称版本备注操作系统windows 10 专业版 1809_X64 JDKjdk1.8.0_121 WIN_X64 数据库mysql5.7 WIN_X64 web服务器Tomcat8.5 WIN_X64 2.入门示例 2.1示例流程简述 第…...
wordpress古文主题/培训机构网站
JVM 内部原理(六)— Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基…...
wordpress主题框架Genesis/网上怎么推销自己的产品
在微软平台上,想追求新鲜是越来越不容易了! 昨晚在家,想试一把WPF,到微软网站上去下载orcas最新的版本,发现竟有8个img文件需要下载。想这将来卸载时,也要花不少时间吧,于是就准备下那个base im…...
wordpress滑动门/青岛app开发公司
鉴于numpy中矩阵的运算居多,所以以下内容中参与运算的数据元素都默认为矩阵,且以矩阵的逐元素相乘这个操作为例子进行说明。 numpy中的广播(broadcast)说白了就是干一件事——扩展矩阵,而且扩展对象都是纬度比较小的矩阵,将维度较…...
巴中城市建设投资有限公司网站/房地产销售技巧和话术
发现问题我使用的Oracle11g,当我敲下如下一段命令后,就让我傻眼了。。alter system set sga_max_size960M scopespfile;shutdown immediatestartup此时的startup报错了,错误为:SQL> startupORA-00844: Parameter not taking ME…...