大话java异常家族-检查与非检查

news/2024/11/17 22:35:33/

先假设你是java异常家族中的一个自定义的非检查异常,你的父亲正是大名鼎鼎的RunTimeException 

首先认识一下你的老祖Throwable ,这可是你们家族唯一的老祖

你的祖宗生了你的爷爷Exception和你的堂爷爷Error

你堂爷爷犯了严重错误,导英年早逝  (Error 表示严重错误,通常是指 JVM 本身出现的内部错误,例如 java.lang.StackOverflowError 或 java.lang.OutOfMemoryError。Error 类型的错误通常是无法修复的,程序必须终止执行。)

你爷爷Exception 子孙满堂 子孙主要分两个分支检查异常和非检查异常 (Exception 表示应用程序出现的错误,它又分为两种类型:受查异常(Checked Exception)和非受查异常(Unchecked Exception)。

在 Java 中,受查异常(Checked Exception)是指在方法中可能会抛出的异常,编译器会强制要求在方法签名中声明它们或在方法内部进行显式的处理。这样,调用该方法的代码就必须通过 try-catch 块捕获和处理这些异常,或者在方法签名中声明抛出它们。

与受查异常相反,非受查异常(Unchecked Exception),也称为运行时异常(RuntimeException),是指在方法中可能会发生但不需要在方法签名中声明或显式处理的异常。这些异常通常是由程序员的编程错误导致的,例如空指针引用(NullPointerException)、数组越界(ArrayIndexOutOfBoundsException)等。这些异常在编译时不会强制要求捕获或声明,可以在运行时由程序直接抛出。)

其实你爷爷Exception本身就属于检查异常,只是从你父亲(RunTimeException )这一脉开辟了非检查异常的先河 从你父亲(RunTimeException )这一脉开始往下都是隶属于非检查异常,当然也包括你,然后你父亲的兄弟姐妹都是继承了你爷爷的检查异常

有一天你开始疑惑为啥是你父亲(RunTimeException )开创非检查异常,你反复看你父亲履历(源码)也没发现什么特殊的地方,然后你开始往上翻你的家族史,终于在你的老祖履历中发现了

public synchronized Throwable fillInStackTrace() {if (stackTrace != null ||backtrace != null /* Out of protocol state */ ) {fillInStackTrace(0);stackTrace = UNASSIGNED_STACK;}return this;}

你发现如果你有一个自定义的堂爷爷重写这个方法

// 重写 fillInStackTrace 方法@Overridepublic synchronized Throwable fillInStackTrace() {return null;}

 结果也会是一个非检查异常(不建议这种写法

事实上,RuntimeException 之所以成为非检查异常是由 Java 语言规范定义的。Java 规范中将异常分为两类:检查性异常和非检查性异常。其中,检查性异常在编译期强制进行检查,必须在方法签名中声明或捕获;而非检查性异常不需要在编译期进行检查,可以在代码中选择性地捕获或声明。RuntimeException 及其子类被定义为非检查性异常,因此可以在代码中随意抛出而不进行强制检查。

简单来说,Java 规范将 RuntimeException 定义为非检查异常,这是一个约定俗成的规则。虽然源码中并没有特殊操作,但这个规则在编译器和 JVM 中得到了支持,使得我们可以在编写程序时针对 RuntimeException 以非检查异常的方式进行处理。


http://www.ppmy.cn/news/1236979.html

相关文章

深信服防火墙路由模式开局部署-手把手教学(小白篇)

PS:深信服的设备只有400能够通过console连接,一般用户是无法连接的,所以大家不要妄想着从Console连接设备了,开局就通过MANAGE进入Web就可以 接通电源后,开机拿一根网线,一端连接防火墙的MANAGE口&#xf…

【python爬虫】scrapy在pycharm 调试

scrapy在pycharm 调试 1、使用scrapy创建一个项目 scrapy startproject tutorial 2、在朋友pycharm中调试scrapy 2.1 通过文件run.py调试 在根目录下新建一个文件run.py(与scrapy.cfg文件的同一目录下), debug ‘run’即可 # -*- coding:utf-8 -*- …

编程参考 - C++ Code Review: 一个计算器的项目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1,拿到一个project,第一眼看,没有配置文件,说明没有引入持续集成系统,continuous integration system。 2,然后看cmake文件,使用的子…

Springmvc原理解析

1. DispatcherServlet springmvc的核心控制器,负责截获所有的请求,当截获请求后委托给HandlerMapping进行请求映射的解析工作,目的是找到哪一个Controller的方法可以处理该请求,找到后再交由给HandlerAdaptor去负责调用并返回Mod…

二叉树题目:具有所有最深结点的最小子树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:具有所有最深结点的最小子树 出处:865. 具有所有最深结点的最小子树 难度 5 级 题目描述 要求 给定…

STM32笔记---RTC

目录 一、RTC简介 二、主要特性 三、功能描述 3.1 读RTC寄存器 3.2 配置RTC寄存器 四、BKP简介 五、RTC_Init() 1. 函数BKP_ReadBackupRegister 2.RCC_LSEConfig设置外部低速晶振(LSE) 3.RTC基本结构 5.RTC_Init()实现 6.time.h 一、R…

Docker run 命令

docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS说明: -a stdin:指定标准输入输出内容类型,可选STDIN/STDOUT/STDERR三项; -d:后台运行容器&am…

代码随想录算法训练营第三十二天| 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 ||

目录 122 买卖股票的最佳时机 || 55 跳跃游戏 45 跳跃游戏 || 122 买卖股票的最佳时机 || 设置变量now代表此时买入的股票,为赋值为Integer.MAX_VALUE,遍历prices数组,有如下两种情况: 如果比now小说明不能售出,可以…