异常的层次结构
Throwable
Throwable是Java语言中所有错误与异常的超类
Throwable包括两个子类: Error(错误)和Exception(异常),它们通常用于指示发生了异常情况。
Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。
Error(错误)(JVM层面)
Error类及其子类: 程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出等错误。此类错误发生时JVM将终止线程。
这些错误是不受检异常,非代码性错误。因此当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的。
Exception(异常)(应用程序层面)
程序本身可以捕获并且可以处理的异常。Exception这种异常又分为两类:运行时异常和编译时异常。
1、运行时异常与非运行时异常
运行时异常
都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等。 这些异常不受检,程序中可以选择捕获也可以不捕获。
运行时异常的特点是Java编译器不会检查它,当前程序可能出现这些异常,既是没有try-catch语句捕获也没有throws抛出它,也会被编译通过。
非运行时异常(编译异常)
是RuntimeException以外的异常,属于Exception类及其子类。从程序角度出发必须处理的的异常,如果不处理无法通过编译。如IOException、SQLException等以及用户自定义的异常。
2、受检异常和非受检异常
受检异常(可查异常)
受检异常即为非运行时异常,也就是除了RuntimeException以外的Exception及其子类
不受检异常(不可查异常)
包括运行时异常和错误