Skip to main content

异常

David LiuAbout 3 min

异常

Java 异常类层次结构图

Exception 和 Error 区别

所有异常都有一个共同的祖先:Throwable 类。该类有两个重要的子类:

  • Exception:程序本身可以处理的异常,可以通过 catch 来进行捕获。Exception 又可以分为:

    • Checked Exception (受检查异常,必须处理)
    • Unchecked Exception (不受检查异常,可以不处理)。
  • ErrorError 属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获不建议通过catch捕获 。例如

    • Java 虚拟机运行错误(Virtual MachineError
    • 虚拟机内存不够错误(OutOfMemoryError
    • 栈溢出错误(StackOverFlowError
    • 类定义错误(NoClassDefFoundError

    这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。

Checked Exception 和 Unchecked Exception 区别

Checked Exception 即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被 catch或者throws 关键字处理的话,就没办法通过编译。

比如下面这段 IO 操作的代码:

RuntimeException = UncheckedException,可以不用 throw 也不用 try 包裹

RuntimeException and its subclasses are unchecked exceptions. Unchecked exceptions do not need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.

NullPointerException(空指针异常)、

IndexOutOfBoundsException(下标越界异常)、

ClassCastException(类转换异常)、

ArrayStoreException(数据存储异常,操作数组时类型不一致)、

IO 操作的 BufferOverflowException 异常;

RuntimeException 以外的异常,是非运行时异常、 checked exceptions 编译异常,是类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、SQLException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。

运行时异常(RuntimeException)是 Java 中的一种异常类型,它通常是由程序错误或逻辑错误引起的。与受检查异常(Checked Exception)不同,运行时异常不需要在方法签名中声明,也不需要在调用方法时显式地捕获或抛出。

以下是一些常见的运行时异常及其出现的场景:

  1. NullPointerException(空指针异常):当尝试访问一个空对象的属性或方法时,会抛出 NullPointerException 异常。例如,当一个对象为 null 时,调用它的方法或属性就会抛出空指针异常。

  2. ArrayIndexOutOfBoundsException(数组下标越界异常):当尝试访问数组中不存在的元素时,会抛出 ArrayIndexOutOfBoundsException 异常。例如,当尝试访问数组中的负数下标或超出数组长度的下标时,就会抛出数组下标越界异常。

  3. ClassCastException(类型转换异常):当尝试将一个对象强制转换为不兼容的类型时,会抛出 ClassCastException 异常。例如,当尝试将一个字符串对象转换为整数类型时,就会抛出类型转换异常。

  4. IllegalArgumentException(非法参数异常):当传递给方法的参数不合法或不正确时,会抛出 IllegalArgumentException 异常。例如,当传递给方法的参数为 null 或超出有效范围时,就会抛出非法参数异常。

  5. IllegalStateException(非法状态异常):当对象处于不正确的状态时,会抛出 IllegalStateException 异常。例如,当尝试在未初始化的对象上调用方法时,就会抛出非法状态异常。

需要注意的是,这些异常通常是由程序员的错误或逻辑错误引起的,因此在编写程序时应该尽可能避免这些异常的出现。

异常处理

try

finally 里面可以写 return,但是一定会执行,一旦写了,那么 try 和 catch 块里的 return 语句都会失效