一文读懂 Java 异常体系

写程序的时候,编辑器会提示错误,关键字拼错了,语法不符合规则,不符合泛型;程序编译的时候,编译器会提示错误,检查是否符合 Java 的语法规范,没有通过编译器检查的程序就无法编译,也就无法运行。这些都是在程序正式运行之前,先排除掉一些通过 Java 的规范就可以排除调的错误。
Exceptio 和 Error
接着程序才可以正式运行,程序运行时任然会出现异常。针对程序运行时出现的异常,Java 将其分成了两大类,一类是 Exception,一类是 Error,它们都继承自 Throwable 接口。
- Throwable 接口是所有异常(Exception 和 Error)的父类,也只有 Throwable 类型的实例才可以被抛出(throw)和捕获(catch)。具体来说就是继承 Throwable 的类,及其子类,以及 @throw 注解的类。
- Error 是一些不常见的异常,大部分 Error 发生的时会直接导致程序不可用,也就不涉及出现 Error 时该怎么编程处理。比如说 OutOfMemoryError 出现时表明 JVM 中的内存已经满了,我们无法在发生 OutOfMemoryError 时编程处理它,只能以事后分析 GC 日志的方式,对代码、机器或者 JVM 参数进行调整。
- Exception 是程序运行过程中,可以被预料到的,可能会发生的异常。Exception 又分为可检查(checked)异常和不检查(unchecked)异常:
- 可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分,比如 IOExceptio、SQLException。
- 不检查异常就是所谓的运行时异常,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求,比如 NullPointerException、ArrayIndexOutOfBoundsException。
- 所以说 UnChecked 异常包括 Error、及 RuntimeException;Checked 异常是 Exception 中处 RuntimeException 之外的异常。

常见的 Exception
RuntimeException

UncheckedException

Java 处理异常的两种手段
Java 处理异常有两种手段:
- 一种是使用 try...catch...finally... 语句块
- 一种是使用 throw 抛出异常
- try...with...resources 是 try...catch...finally... 的设计版,能够帮助我们自动关闭资源
throws、throw
- throw 是在方法中抛出一个异常实例,由该方法的调用者来处理这个异常。
- throws 是在方法上申明该方法可能抛出的异常,告诉调用者调用该方法可能抛出该异常,一般与 throw 成对出现。
try、catch、finally
- 可以是 try...catch 、try...finally、try...catch...finally 的形式
- throws、throw 对异常的处理采用向上层抛出的方式;
- try、catch、finally 则是采用自行在方法中处理异常,当然它的处理方式也可以是继续向上抛出。
try...with...resources
- JDK7 之后增加的语法糖,不需要显示来写关闭资源的方法
异常链
异常链是指我们捕获异常之后,将异常信息传给上层,然后逐层抛出异常,,Java API文档中给出了一个简单模型:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw (HighLevelException) new HighLevelException().initCause(le);
}
当程序捕获到了一个底层异常,在处理部分选择了继续抛出一个更高级别的新异常给此方法的调用者。 这样异常的原因就会逐层传递。这样,位于高层的异常递归调用getCause()方法,就可以遍历各层的异常原因。
自定义异常
自定义异常就是我们自己写一个类,继承某种类型的Exception,在使用它的时候就可以 throw new BusinessException(code, msg);
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 1L;
private Integer code; //错误码
public BusinessException() {}
public BusinessException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
}
public BusinessException(ResultEnum resultEnum, String errorMsg) {
super(errorMsg);
this.code = resultEnum.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
一文读懂 Java 异常体系的更多相关文章
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- 一文读懂JAVA多线程
背景渊源 摩尔定律 提到多线程好多书上都会提到摩尔定律,它是由英特尔创始人之一Gordon Moore提出来的.其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍 ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 一文读懂Java中的动态代理
从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...
- 一文读懂 JAVA 异常处理
JAVA 异常类型结构 Error 和 Exeption 受查异常和非受查异常 异常的抛出与捕获 直接抛出异常 封装异常并抛出 捕获异常 自定义异常 try-catch-finally try-wit ...
- 夯实Java基础系列16:一文读懂Java IO流和常见面试题
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 一文读懂Java类加载机制
Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存, ...
- 别指望一文读懂Java并发之从一个线程开始
Understanding concurrent programming is on the same order of difficulty as understanding object-orie ...
- [No0000196]一文读懂Java 11的ZGC为何如此高效
导读:GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC ...
随机推荐
- 基于vue+Django的简迩音乐用户界面实现
应这次软件工程课程要求,我们团队着力打造一个音乐播放器软件. 软件实现主要采用基于Vue.js+Python Django,前后端分离架构实现网页. 用户界面主要功能:呈现用户收藏歌单歌曲信息,并且提 ...
- 洛谷P2468 粟粟的书架
题目链接:https://www.luogu.org/problemnew/show/P2468 知识点: 可持久化线段树.二分.前缀和 解题思路: 对于 \(R, C \le 200, M \le ...
- Centos慢慢长大(一)
1.写在前面 这将是一个系列性的文章.可能更多的是记录我在学习的过程中的一些感悟吧.我想强调的是在这一系列文章里我会从最小化的安装开始,然后逐渐的增加需要安装的软件.就象一个婴儿的诞生,慢慢的学走路. ...
- Java——分布式
分布式编程技术的基本思想:客户计算机产生一个请求,然后将这个请求通过网络发送到服务器.服务器处理这个请求,并发送回一个针对该客户端的响应,供客户端进行分析.客户端和服务端之间用代理进行通讯,客户端调用 ...
- 机器人操作系统——ROS,Robot Operating System
Note:偶然看到的滴滴研究院的无人驾驶竞赛,了解一下. ROS:专为机器人软件开发所设计出来的一套电脑操作系统架构.是一个开源的元级操作系统(后操作系统),提供类似操作系统的服务,包括硬件抽象描述. ...
- 初尝 Blazor WebAssembly
一. 前言 Blazor 的整体介绍以及特点与优势,建议翻阅 Blazor 介绍. Blazor 是一个可是使用 .NET/C# 来编写交互式客户端的 Web UI 框架,在官网有一句话概括 &quo ...
- (板子)缩点 + DAG上的DP(深搜)luogu P3387
板子传送门 根据题目意思,我们只需要找出一条点权最大的路径就行了,不限制点的个数.那么考虑对于一个环上的点被选择了,一整条环是不是应该都被选择,这一定很优,能选干嘛不选.很关键的是题目还允许我们重复经 ...
- 分布式项目开发-web.xml基础配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- 解决SpringBoot在后台接收前台传递对象方式
问题描述 前台传递对象,不管是通过ajax请求方式,还是axios请求方式.后台应该怎么接收对象处理呢? 比如前台传递 ajax方式: $.ajax({ url: "后台的方式", ...
- 关于zabbix利用snmp协议从交换机获取的端口带宽数据的概念问题
关于zabbix利用snmp协议从交换机获取的端口带宽数据的概念问题:使用端口OID号获得的数据实际是即时的端口总数据量,而在计算带宽时,需要选择一个时间段,在时间段的结束点获得的总数据量减去在时间段 ...