一文读懂 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 ...
随机推荐
- PHP的图像函数
imagecreate() 和 imagecreatetruecolor() 函数用于创建一幅空白图像. imagedestroy() 函数用于销毁图像资源. imagecreate() 如果我们要对 ...
- Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/j..........
如果你在执行 docker images 出现这样的问题 注意:把你的用户切到root下
- SpringBoot整合SpringSecurity实现JWT认证
目录 前言 目录 1.创建SpringBoot工程 2.导入SpringSecurity与JWT的相关依赖 3.定义SpringSecurity需要的基础处理类 4. 构建JWT token工具类 5 ...
- 剑指Offer之二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解法1:使用Integer.toBinanryString()返回int变量的二进制表示的字符串. [在Intege ...
- C# 7.0 新增功能&结合微软简化理解
C# 7.0更新时间为2019.2左右 C# 7.0 ~ 7.3 分别需要VS2017 与 .NET Core 1.0. .NET Core 2.0 SDK..NET Core 2.1 SDK,需要在 ...
- php日志监控
<?php date_default_timezone_set('Asia/Shanghai'); $time = date('Y-m-d H:i:s',time()); //访问时间 $ip ...
- java内部类简单用法
package innerClass; /** * 特点 * 1:增强封装性,通过把内部类隐藏在外部类的里面,使得其他类不能访问外部类. * 2:增强可维护性. * 3:内部类可以访问外部的成员. * ...
- secureCRT连接liunx(centos6.5)系统步骤以及碰见的问题
1.首先安装secureCRT以及用vmware安装centos6.5系统,用vmware打开centos6.5系统 2.找到liunx系统的ip,在liunx终端用ifconfig找到ip如下图: ...
- css background-image 学习笔记
先给出图片原样 1.默认从从上到右下1比1 填充的,如果元素的高度和宽度小于图片,则只能显示部分图片.效果如下图 2.如果元素的高度和宽度大于图片,则默认会用图片平铺元素.效果如下图 3.可以是用ba ...
- webmin RCE漏洞利用及分析
Webmin是目前功能最强大的基于Web的Unix系统管理工具.管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作. 利用条件:webmin <= 1.910 原因:官网 Sou ...