异常Throwable

认识异常

异常是相对于return(正常退出)的一种退出机制。
当JVM发现一些非正常情况时,无法继续执行了,启用异常处理机制:先创建一个异常对象并抛出(throw),然后查找看谁能处理这个异常;会从当前函数开始查看谁捕获了该异常,当前函数没有就查看上一层函数,直到主函数。如果异常没有被捕获会使用默认处理机制:输出异常栈信息并退出。
没有异常机制时,程序员通过函数返回值判断是否异常,return是推出的唯一机制。正常逻辑和异常逻辑混杂在一起,难以理解和维护。且经常忽略对返回值的检查,降低了程序的可靠性。
异常引入后,程序正常逻辑和异常逻辑可以分离,异常情况可以集中进行处理,还可以自动向上传递,不再需要每层方法都进行处理。并且throws声明后,上层方法调用时也不能选择忽略。代码的可读性、可靠性、可维护性都得到提高。

异常类体系

在这里插入图片描述
构造函数中的两个主要参数:message表示异常信息;cause表示触发该异常的异常,这样异常间可以形成caused by链。
Error表示系统错误或资源耗尽,由Java系统自己使用,应用程序不应该抛出和处理。
Exception表示应用程序错误。
其中Error和RuntimeException为非受检异常;其他异常为受检异常。受检异常指java强制要求程序员处理,否则会编译错误。
自定义异常时,一般继承Exception或它的某一子类;如果父类是RuntimeException则自定义异常也是非受检异常。

异常处理

try catch 匹配并捕获异常
根据try代码块中抛出的异常类型,寻找第一个匹配到的catch块,找到后执行该catch块并且不再执行其他catch块。
需要注意:抛出的异常类型是catch中声明异常的子类型也算匹配,所以需要将具体子类放在前面。如果将Exception放在最前面,则必然匹配,其后的具体子类匹配代码块不会被执行。

重新抛出异常
catch到异常并处理后,还可以重新抛出异常。适用于以下场景:
1. 当前代码对异常处理不完全,需要上层程序进一步处理;
2. 当前异常不合适(信息不足或者过于细节),重新throw一个自定义的异常;

finally
try catch finally
finally代码块中的代码必然会执行:
1. 如果没有异常发生,try执行结束后会执行finally;
2. 如果异常发生且被catch捕获,在catch执行结束后执行;
3. 如果异常发生但并未被捕获,在异常抛给上层函数前执行;
特别的,如果try或者catch中存在return语句。return会在finally代码块执行后执行,但finally并不会改变return的返回值。
但是如果finally代码块中也存在throw或者return,会改变try或catch中的结果,掩盖try或catch块中的异常。因此,要避免在finally代码块中return或throw异常

try-with-resources
Java 7开始支持的语法,针对实现了java.lang.AutoCloseable接口的对象,代替了在finally代码块中显式关闭的语法,减少资源得不到关闭引起的资源损耗。在try代码块执行结束后会自动调用AutoCloseable的close方法。

public interface AutoCloseable {
    void close() throws Exception;
}

throws
声明一个方法可能抛出的异常。表明该方法可能抛出这些异常,并且没有对这些异常进行处理或处理的不够完善,需要上层调用者继续处理。
对于非受检异常不要求显式使用throws声明;但是对于受检异常必须声明否则不能抛出。
对于受检异常不可以抛出而不声明,但可以声明但不抛出(父类声明,子类重写时抛出异常)。

异常使用

  1. 异常应该用且仅用于异常情况。指异常不能代替正常的逻辑判断(增加判断而非等待异常抛出),且不能作为正常处理(异常抛出而非返回特殊值);
  2. 异常的处理目标是恢复(捕获异常,增加容错,继续程序执行)或报告(记录或报告异常,中止程序执行);
  3. 异常处理一般逻辑:如果自己直到如何处理异常就自行处理,不要上报异常;不能被完全解决的异常要向上报告,但自己要尽量提供有助于分析和解决问题的额外信息,可以以原异常为cause重新抛出一个异常(非必须)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值