异常类体系
以Throwable为根,Java定义了非常多的异常类,表示各种类型的异常,部分类如图6-1所示。
图6-1 Java异常类体系
Throwable是所有异常的基类,它有两个子类:Error和Exception。
Error表示系统错误或资源耗尽,由Java系统自己使用,应用程序不应抛出和处理,比如图6-1中列出的虚拟机错误(VirtualMacheError)及其子类内存溢出错误(OutOfMemory-Error)和栈溢出错误(StackOverflowError)。
Exception表示应用程序错误,它有很多子类,应用程序也可以通过继承Exception或其子类创建自定义异常,图6-1中列出了三个直接子类:IOException(输入输出I/O异常)、RuntimeException(运行时异常)、SQLException(数据库SQL异常)。
RuntimeException比较特殊,它的名字有点误导,因为其他异常也是运行时产生的,它表示的实际含义是未受检异常
(unchecked exception),相对而言,Exception的其他子类和Exception自身则是受检异常
(checked exception),Error及其子类也是未受检异常。
受检(checked)和未受检(unchecked)的区别在于Java如何处理这两种异常。对于受检异常,Java会强制要求程序员进行处理,否则会有编译错误,而对于未受检异常则没有这个要求。下文我们会进一步解释。
RuntimeException也有很多子类,表6-1列出了其中常见的一些。
表6-1 常见的RuntimeException
如此多不同的异常类其实并没有比Throwable这个基类多多少属性和方法,大部分类在继承父类后只是定义了几个构造方法,这些构造方法也只是调用了父类的构造方法,并没有额外的操作。
那为什么定义这么多不同的类呢?主要是为了名字不同。异常类的名字本身就代表了异常的关键信息,无论是抛出还是捕获异常,使用合适的名字都有助于代码的可读性和可维护性。
https://www.bilibili.com/video/BV1XD4y1N7pm/?p=1&vd_source=a7816e3b2a3a67ac39dc87f6bf92421c