作者:allen4tech 慕课网
JAVA 异常类型结构Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception.
文章插图
Error 和 Exeption
- Error
- Exception
受查异常和非受查异常
- 受查异常
通过 throws 关键字声明可能抛出的异常
文章插图
try-catch 处理异常
文章插图
- 非受查异常
非受查异常不会在编译时被检测 。JAVA 中 Error 和 RuntimeException 类的子类属于非受查异常,除此之外继承自 Exception 的类型为受查异常 。
异常的抛出与捕获
直接抛出异常
通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去 。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常 。
文章插图
封装异常再抛出
有时我们会从 catch 中抛出一个异常,目的是为了改变异常的类型 。多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节 。
文章插图
捕获异常
在一个 try-catch 语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理
文章插图
同一个 catch 也可以捕获多种类型异常,用 | 隔开
文章插图
自定义异常
习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详细描述信息的构造函数(Throwable 的 toString 方法会打印这些详细信息,调试时很有用)
文章插图
try-catch-finally
当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和 catch 语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题 。
文章插图
调用该方法时,读取文件时若发生异常,代码会进入 catch 代码块,之后进入 finally 代码块;若读取文件时未发生异常,则会跳过 catch 代码块直接进入 finally 代码块 。所以无论代码中是否发生异常,fianlly 中的代码都会执行 。
若 catch 代码块中包含 return 语句,finally 中的代码还会执行吗?将以上代码中的 catch 子句修改如下:
文章插图
调用 readFile 方法,观察当 catch 子句中调用 return 语句时,finally 子句是否执行
文章插图
可见,即使 catch 中包含了 return 语句,finally 子句依然会执行 。若 finally 中也包含 return 语句,finally 中的 return 会覆盖前面的 return.
try-with-resource
上面例子中,finally 中的 close 方法也可能抛出 IOException, 从而覆盖了原始异常 。JAVA 7 提供了更优雅的方式来实现资源的自动释放,自动释放的资源需要是实现了 AutoCloseable 接口的类 。
推荐阅读
- 36块麻辣烫是什么梗?
- 全网最硬核解读计算机启动原理
- 这应该是最全的Redis解析了
- 图解Raft:应该是最容易理解的分布式一致性算法
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 体育健身|刘畊宏健身操火遍全网!专家提醒:要坚持3个月以上 否则没啥效果
- 柴犬的价格应该是估计 柴犬价格为什么这么贵
- 白茶收藏需注意的问题,冲泡白茶的水温应该是多少
- 狗狗正常体温应该是多少 狗狗多少体温属于正常