Java 异常

123 阅读2分钟

异常的层次结构

java-basic-exception-1.png

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及其子类

不受检异常(不可查异常)

包括运行时异常和错误