Java异常体系概述

Java异常体系

在Java中,利用类对所有不正常的现象进行了描述,并将其封装成对象。通过这些类,Java语言定义了一套完整的、专门用来处理Java中的各种异常的机制,我们称之为Java的异常机制(或体系)。

在大多数初学者的印象中(包括笔者),Java异常机制的体系结构应该包含这么几个要点:

  • 所有异常类都是Throwable的子类
  • 异常可分为Error(错误)和Exception(异常)两类
  • Exception又可分为RuntimeException(运行时异常)和非运行时异常两类

对于Error,RuntimeException以及非运行时异常这三个异常类,又包含了很多具体的直接子异常类,这里不再赘述。

通过以上知识点,已然可以构建出Java异常机制的体系结构的基本面貌。翻阅API后,我们也不难得知——对于Java语言本身而言,异常机制确实就是如此。下图描述了传统的Java异常体系结构。

然鹅,传统的异常体系结构描述虽然简单且正确,但在逻辑和理解性上稍显逊色。这里笔者更推荐下述的异常分类结构。

这种异常分类结构来自Alibaba的《码出高效:Java开发手册》一书,相比传统的异常体系结构,这种分类方式,更具有逻辑性,且在具体的开发场景中更有帮助。笔者结合《码出高效:Java开发手册》书中的定义对这种进阶版的异常分类方式中各个异常类型意义进行简单解释。

  • 同样,Throwable作为所有异常类的超类存在。Throwable可以分为Error(致命异常)和Exception(非致命异常)两类。
  • Error是一种非常特殊的异常类型,它的出现标识着程序发生了不可控的错误,例如OOM或栈溢出等。针对此类错误,程序无法处理,只能人工介入。
  • Exception可进一步分为Checked Exception(受检异常)和Unchecked Exception(非受检异常)。
  • Checked Exception(受检异常)。是需要在代码中显式处理的异常,如果不进行处理,则会出现编译错误。常见的受检异常包括SQLException、ClassNotFoundException等。笔者在学习Java的过程中,也听过有人将此类异常称之为“编译时异常”。Checked Exception可进一步细分为两类:
    • 无能为力,引起注意型。针对此类异常,程序无法处理,如字段超长等导致的SQLException,即使做再多的重试对于解决异常也没有任何帮助,一般处理此类异常的做法是完整的保存异常现场,供开发工程师介入解决。
    • 力所能及,坦然处置型。如发生未授权异常(UnAuthorizedException),程序可跳转至权限申请页面。
  • Unchecked Exception(非受检异常)。是运行时异常,它们都继承自RuntimeException,不需要程序进行显式的捕捉和处理,但这并不意味着此类异常不会发生,如IndexOutOfBoundsException、NullPointerException。Unchecked Exception可进一步细分为三类:
    • Predicted Exception(可预测异常):常见的可预测异常包括IndexOutOfBoundsException、NullPointerException等,基于对代码性能和稳定性的要求,此类异常不应该产生或者被抛出,而应该提前做好边界检查、空指针判断等处理。显式的声明或者捕获此类异常会对程序的可读性和运行效果产生很大影响。
    • Caution Exception(需捕捉异常):对于此类异常,需要进行显式的捕捉,以保持程序的可用性和稳定性。如Dubbo框架进行RFC调用产生的远程服务超时异常DubboTimeoutException,此类异常时客户端必须显式处理的异常,不能因为服务端的异常导致客户端不可用,此时处理方案可以是重试或降级处理等。
    • Ignored Exception(可透出异常):主要是指框架或系统产生的且会自动处理的异常,而程序无需关心。例如针对Spring框架中抛出的NoSuchRequestHandlingMethodException异常,Spring框架会自己完成异常的处理,默认将自身抛出的异常自动映射到合适的状态码,比如启动防护机制跳转到404页面。

不难发现,这种新的异常分类方式可以更好的适应需要处理异常的场景,只需要明确该异常属于哪种类型,就能够针对这样的异常进行合适的处理。避免了异常的泛滥。

 

常见异常类

受限于篇幅,笔者在另一篇博文中结合JavaAPI简单整理了Java中常见的异常类。详情请跳转

《Java常见异常类》https://blog.csdn.net/Return_head/article/details/90243070

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值