Java异常继承结构解析_动力节点Java学院整理
发布时间 - 2026-01-11 00:47:56 点击率:次Java异常类层次结构图:
异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的。假若程序在运行期间出现了错误,如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。因此,如何对运行期间出现的错误进行处理和补救呢?Java提供了异常机制来进行处理,通过异常机制来处理程序运行期间出现的错误。通过异常机制,我们可以更好地提升程序的健壮性。
unchecked exception(非检查异常),也称运行时异常(RuntimeException),比如常见的NullPointerException、IndexOutOfBoundsException。对于运行时异常,Java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
checked exception(检查异常,编译异常),也称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
Exception(异常):是程序本身可以处理的异常。 Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
注意:
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
应该catch什么
其实只要是Throwable和其子类都是可以throw和catch的,那么如果在需要统一处理异常的地方,我们应该catch (Throwable th) 还是 catch (Exception)呢?
这两种处理的区别在于,catch throwable会把Error和其他继承Throwable的类捕捉到。而catch Exception只会捕捉Exception极其子类,捕捉的范围更小。先不考虑有其他的类继承了Throwable的情况下,第一种catch相当于比第二种catch多捕捉了把Error和其子类。
那么究竟Error是否需要捕捉呢?JDK中Error类的的注释(如下)里提到过,Error是一种严重的问题,应用程序不应该捕捉它。
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a “normal” condition, is also a subclass of Error because most applications should not try to catch it.
A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.
Java Lanuage Spec 7 中也提到:Error继承自Throwable而不是继承自Exception,是为了方便程序可以使用 “catch (Exception)“来捕捉异常而不会把Error也捕捉在内,因为Exception发生后可以进行一些恢复工作的,但是Error发生后一般是不可恢复的。
The class Error is a separate subclass ofThrowable, distinct from Exception in the class
hierarchy, to allow programs to use the idiom “} catch (Exception e) { ” (§11.2.3)
to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.
已经不难看出,Java本身设计思路就是希望大家catch Exception就足够了,如果有Error发生,catch了也不会有什么作用。
Error可以catch吗? 可以catch了后做些其他处理吗?
Error是可以catch的,而且也可以向常规Exception一样被处理,而且就算不捕捉的话也只是导致当前线程挂掉,其他线程还是可以正常运行,如果有需要的话捕捉Error之后也可以做些其他处理。但是Error是一种系统内部的错误,这种错误不像Exception一样是可能是程序和业务上的错误是可以恢复的。
以上所述是小编给大家介绍的Java异常继承结构解析_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java
# 异常继承结构
# 异常继承
# 老生常谈 Java中的继承(必看)
# Java中继承thread类与实现Runnable接口的比较
# 详解java中继承关系类加载顺序问题
# Java IO流体系继承结构图_动力节点Java学院整理
# Java Collections集合继承结构图_动力节点Java学院整理
# Java 继承方法实例详解
# JAVA基础之继承(inheritance)详解
# Java编程之继承问题代码示例
# 子类
# 可查
# 应用程序
# 都是
# 抛出
# 是一种
# 其他的
# 会把
# 做些
# 小编
# 也称
# 也不
# 子句
# 都不
# 在此
# 难以预料
# 结构图
# 所需
# 很容易
# 我们可以
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建高效可靠的建站解决方案?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
打造顶配客厅影院,这份100寸电视推荐名单请查收
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何在万网利用已有域名快速建站?
Laravel如何自定义分页视图?(Pagination示例)
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
bootstrap日历插件datetimepicker使用方法
如何在IIS7中新建站点?详细步骤解析
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
java获取注册ip实例
利用JavaScript实现拖拽改变元素大小
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何撰写建站申请书?关键要点有哪些?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
制作电商网页,电商供应链怎么做?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何用狗爹虚拟主机快速搭建网站?
如何获取免费开源的自助建站系统源码?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
大连网站制作公司哪家好一点,大连买房网站哪个好?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
C++时间戳转换成日期时间的步骤和示例代码
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
装修招标网站设计制作流程,装修招标流程?
详解CentOS6.5 安装 MySQL5.1.71的方法
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
如何在阿里云香港服务器快速搭建网站?
如何在宝塔面板创建新站点?
Python函数文档自动校验_规范解析【教程】
如何自定义建站之星模板颜色并下载新样式?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
图册素材网站设计制作软件,图册的导出方式有几种?
大连 网站制作,大连天途有线官网?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Linux系统命令中tree命令详解
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
JavaScript如何操作视频_媒体API怎么控制播放
如何在阿里云服务器自主搭建网站?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
简单实现Android文件上传
Laravel怎么调用外部API_Laravel Http Client客户端使用

