Java基础:异常与错误(ExceptionError)

news2024/11/19 2:39:11

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完整相关类的关系如下图所示。

在这里插入图片描述

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

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

相关文章

Java递归问题

3 递归 3.1 递归基础 递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象递归解决问题的思路: 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重…

CHAPTER 3 Zabbix Grafana

Zabbix & Grafana3.1 Grafana简介3.2 安装grafana3.3 启动grafana3.4 登录控制台3.5 链接zabbix1.安装zabbix插件2.启用插件3.链接数据源4.导入仪表盘5.创建仪表板6.创建仪表盘7.添加自建监控项8.监控信息3.1 Grafana简介 Grafana是一款开源的数据可视化工具,使…

多商户java版小程序+公众号+h5+app秒杀拼团砍价分销商城源码

三勾多商户商城小程序、支持多端发布,一套代码发布到8个平台,面向开发,方便二次开发 项目介绍 三勾多商户小程序商城基于springbootelement-uiuniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端&…

做软文发布需要注意哪些细节?

软文发布是一种有效的网络营销和推广活动,它以媒体等形式把产品信息植入到软文报道或新闻中,进行心理暗示和引导销售,进行正面宣传以及促进销售的新型网络营销方式,它不但能够有效地推行产品宣传、也能有效地提高网络曝光率&#…

【Kafka进阶】-- unclean.leader.election.enable参数的内涵

一、背景近期,我们的kafka 消息队列集群(1.x版本)经过了一次事故。某节点意外宕机,导致 log 文件损坏,重启 kafka 失败,最后导致某个 topic 的分区不可用,本文对此做了简单的分析、解决和复现参考,以此为记…

opencv图像处理

CV模块 基本操作 T1家全叫米TF,拍 图像的IO操作,读取和保存方法在图像上绘制几何图形 怎么获取图像的属性 怎么访问图像的像素,进行通道分离,合并等 怎么实现颜色空间的变换 图像的算术运算 掌握图像的读取和保存方法 # 读取图像 cv.imrea…

Spring Boot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除

一、整个 Quartz 的代码流程基本基本如下:首先需要创建我们的任务(Job),比如取消订单、定时发送短信邮件之类的,这是我们的任务主体,也是写业务逻辑的地方。创建任务调度器(Scheduler),这是用来调度任务的,主要用于启动…

【Unity细节】RigidBody中Dynamic和Kinematic的区别

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity细节和bug ⭐Dynamic和Kinematic的区别⭐ 文章目录⭐Dynamic和Kinematic的区别⭐&#x1f3…

恰饭近800w播放,官方涨粉5000,B站用户直呼“巅峰制作”!

开年之际,QQ飞车在B站打造了一场「2023QQ飞车手游新春会」,并宣布首款女性机甲、赛车皮肤即将上线,携手玩家一起狂欢。来源-B站17日当晚,QQ飞车官方号在B站直播间举办「2023QQ飞车手游新春会」直播活动,共有11位UP主参…

二十五、Gtk4-多线程分析

1 回顾 1.1 Gnome相关 首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。 所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。 Gtk:GUI界面库。GLib&a…

esxi不能识别不兼容网卡解决方案

相信很多网友在安装测试VMWARE Esxi 6.0的时候,总会遇到无法兼容网卡的情况,本人也是遇到了再组装的台式机上测试ESXI 6.0的时候,无法识别REALTEK RTL 8111E的情况。 找了很多网友提供的博客,方法是正确的,但是不够严…

Vue3 中实现关键字高亮的一种思路

前言: 这几天在项目中遇到了需要将用户在搜索框中输入的文字高亮的效果,思考了很久,暂时没有想到更优雅的解决方式,于是采用了最简单的一种思路来实现,特来记录一下。 一. 需求的场景 我接手的这个需求需要和后端搭配&…

搞量化先搞数(下):A股历史行情免费抓取实战

上一节我们学习了如何抓取A股的股票列表,我们成功地将股票列表保存到了本地文件(或数据库)中。那么这一节,我们就来看下如何免费获取A股的历史行情数据。文末附全套代码。 一、寻找提供行情数据的网站 首先我们百度搜索一支股票的名字+行情,看下都哪些网站提供该数据。 …

Docker getting started

系列文章目录 Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…

学习 Linux 内核书籍推荐

原文链接,欢迎关注: 你为什么学习 Linux 内核? - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/31369673/answer/2894981254 主要是工作需要,其实对于我自己的工作来说,在Linux开发的具体业务和算法才是重…

2023年PMP考试难不难?

整个考试的考察方向转向还是比较大的,基本上以“价值传递”和“以人为本”这两个出发点来考察项目经理所需要的能力。 1}新版提纲题目数量的变化 总题量从200道减少到180道,所以答题时间上相对变的宽裕一些。考试时间230分钟,中间有十分钟休…

前端状态管理:Vuex、Flux、Redux、MobX概念篇

概念准备 【状态管理模式】 可以借鉴 Vuex 官方文档的解释:什么是“状态管理模式” 状态管理的目标(意义) 各组件通过数据响应机制对共享状态进行高效的状态更新,说白了就是不同组件对需要共享的数据的变更和同步。 1. Vuex …

学网络运维与安全前景怎么样?

近几年,网络安全问题频频爆发,多数人看不到背后的隐患,但是,企业却因此损失惨重。比如:FaceBook数据泄露2018年上半年,FaceBook 5000万用户数据泄露,导致其市值蒸发360亿美元,品牌遭遇声誉危机。…

markdown和latex常用部分参考@注脚@链接跳转@csdn

文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links🎈Reference LinksURLs文章内部跳转(Heading IDs)🎈My Great Heading注脚(Footnotes)&#x1…

攻防世界1.新手练习区

4.攻防世界1.新手练习区 1.view_source 访问url: http://111.200.241.244:48855/ 鼠标点击右键不起作用,F12审查元素 得到flag为cyberpeace{0f3a3e4ab8c8664f3cf40d4240ec7b53} 2.robots 访问url: http://111.200.241.244:34362/ rob…