Java 异常类

简介

Java 是一种面向对象的编程语言,提供了丰富的异常处理机制。异常是在程序运行过程中发生的错误或异常情况,它可能导致程序无法正常执行。为了解决这些问题,Java 引入了异常类来捕获和处理异常。

Java 的异常类层次结构是通过继承和实现的方式实现的。它的根类是 Throwable,分为两个子类:ErrorExceptionError 表示严重的错误,一般由 JVM 抛出,例如 OutOfMemoryError;而 Exception 表示可恢复的异常,可以由程序员来处理。

异常类的层次结构

Java 异常类的层次结构如下所示:

        Throwable
           |
     |-----------|
     |           |
    Error     Exception

Error

Error 类表示严重错误,一般由 JVM 抛出,无法通过程序来恢复。常见的 Error 类包括 OutOfMemoryError(内存溢出)、StackOverflowError(栈溢出)等。当出现 Error 时,程序无法继续执行,需要重新启动 JVM。

Exception

Exception 类表示可恢复的异常,可以由程序员来处理。Exception 类有两个重要的子类:RuntimeExceptionIOException

RuntimeException

RuntimeException 是一个未被检查的异常,它通常由程序错误导致,可以通过编码规范来避免。RuntimeException 的子类有 NullPointerException(空指针异常)、IndexOutOfBoundsException(索引越界异常)等。

IOException

IOException 是一个被检查的异常,它通常由于输入/输出操作失败或被中断导致。IOException 的子类包括 FileNotFoundException(文件未找到异常)、EOFException(输入流到达文件末尾异常)等。

异常处理

在 Java 中,使用 try-catch 语句来处理异常。try 代码块用于包含可能抛出异常的代码,而 catch 代码块用于捕获并处理异常。下面是一个示例:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理 ExceptionType1 异常
} catch (ExceptionType2 e2) {
    // 处理 ExceptionType2 异常
} finally {
    // 不管是否抛出异常,都会执行的代码
}

try 代码块中,我们可以包含多个 catch 语句,每个 catch 语句用于捕获特定类型的异常,并进行相应的处理。如果抛出的异常类型与某个 catch 语句的类型匹配,则该 catch 语句会被执行。如果所有的 catch 语句都没有匹配的异常类型,异常将被传递给上一级调用者进行处理。

finally 代码块可选,它包含了一些无论是否抛出异常都要执行的代码。通常,我们将释放资源的代码放在 finally 代码块中,以确保资源的正确释放。

抛出异常

我们可以通过 throw 语句在程序中主动抛出异常。throw 语句后面跟着一个 throwable 对象,可以是一个异常对象或者是一个实现了 Throwable 接口的类的对象。

void divide(int dividend, int divisor) {
    if (divisor == 0) {
        throw new ArithmeticException("除数不能为零");
    }
    int result = dividend / divisor;
    System.out.println("结果:" + result);
}

public static void main(String[] args) {
    try {
        divide(10, 0);
    } catch (ArithmeticException e) {
        System.out.println("捕获到异常:" + e.getMessage());
    }
}

在上面的例子中,我们定义了一个 divide 方法,它会检查除数是否为零。如果除数为零,我们使用 throw 语句抛出一个 ArithmeticException 异常。在 main 方法中,我们