导图社区 java异常机制
关于java异常机制的思维导图,包含what:由于各种不期而至的情况,导致程序中断运行的一种指令流;分类/层级;How:怎么处理异常、怎么自定义异常等。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
关于JAVA语言思维导图的思维导图,包含1.发展历程、2.编程开发、3.语言特点、4.工作原理、5.语言基础、6.语言标准、7.语言规范、8.技术应用。
java学习重点 2019笔试面试考点的思维导图,包含数学与逻辑思维;开发方法;开发思想;设计模式;基础知识;并发编程;分布式架构;微服务架构;性能优化。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
异常
what
概念
由于各种不期而至的情况,导致程序中断运行的一种指令流
模型
分类/层级
Throwable
Error
表示系统错误或资源耗尽,由Java系统自己使用,应用程序不应抛出和处理
Exception
未受检异常
RuntimeException及其子类
受检异常
对于受检异常,Java会强制要求程序员进行处理,否则会有编译错误,而对于未受检异常则没有这个要求
How
怎么处理异常
异常机制来统一处理
可以由系统触发,也可以由程序通过throw语句触发
首先创建一个异常对象,这里是类NullPointerException的对象,然后查找看谁能处理这个异常
一般逻辑
如果自己知道怎么处理异常,就进行处理
如果可以通过程序自动解决,就自动解决
如果异常可以被自己解决,就不需要再向上报告
如果自己不能完全解决,就应该向上报告
如果自己有额外信息可以提供,有助于分析和解决问题,就应该提供,可以以原异常为cause重新抛出一个异常
如果异常不能自动解决,则应该输出详细的异常链和异常栈到日志
具体方法
try/catch匹配
重新抛出异常throw
在catch块内处理完后,可以重新抛出异常,异常可以是原来的,也可以是新建的
当前Exception作为cause传递给了下一个Exception,这样就形成了一个异常链,捕获到下一个Exception的代码可以通过getCause()得到当前Exception
finally
finally内的代码不管有无异常发生,都会执行
如果没有异常发生,在try内的代码执行结束后执行
如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
如果有异常发生但没被捕获,则在异常被抛给上层之前执行
try-with-resources
public static void useResource() throws Exception { try(AutoCloseable r = new FileInputStream("hello")) { //创建资源 //使用资源 } }
这种语法针对实现了java.lang.AutoCloseable接口的对象,调用资源的关闭方法
资源可以定义多个,以分号分隔
throws
throws跟在方法的括号后面,可以声明多个异常,以逗号分隔
如果一个方法内调用了另一个声明抛出受检异常的方法,则必须处理这些受检异常,处理的方式既可以是catch,也可以是继续使用throws
怎么自定义异常
一般是继承Exception或者它的某个子类。如果父类是RuntimeException或它的某个子类,则自定义异常也是未受检异常;如果是Exception或Exception的其他子类,则自定义异常是受检异常
Where
能用场景
真正出现异常的时候,应该抛出异常,而不是返回特殊值
不能用场景
异常不能代替正常的条件判断
Who
和哪个知识相关联
throw关键字可以与return关键字进行对比。return代表正常退出,throw代表异常退出;return的返回位置是确定的,就是上一级调用者,而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定
Why
其他点的剖析
为什么要重新抛出
因为当前代码不能够完全处理该异常,需要调用者进一步处理
为什么要抛出一个新的异常
因为当前异常不太合适。不合适可能是信息不够,需要补充一些新信息;还可能是过于细节,不便于调用者理解和使用,如果调用者对细节感兴趣,还可以继续通过getCause()获取到原始异常
Watch
注意点
1. 抛出的异常类型是catch中声明异常的子类也算匹配,所以需要将最具体的子类放在前面,如果基类Exception放在前面,则其他更具体的catch代码将得不到执行
2. 如果在try或者catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值
3. finally中有return不仅会覆盖try和catch内的返回值,还会掩盖try和catch内的异常,就像异常没有发生一样
4. 自Java 7开始支持一种新的语法,多个异常之间可以用“|”操作符
5. 异常应该且仅用于异常情况,是指异常不能代替正常的条件判断