Java 异常类
简介
Java 是一种面向对象的编程语言,提供了丰富的异常处理机制。异常是在程序运行过程中发生的错误或异常情况,它可能导致程序无法正常执行。为了解决这些问题,Java 引入了异常类来捕获和处理异常。
Java 的异常类层次结构是通过继承和实现的方式实现的。它的根类是 Throwable
,分为两个子类:Error
和 Exception
。Error
表示严重的错误,一般由 JVM 抛出,例如 OutOfMemoryError
;而 Exception
表示可恢复的异常,可以由程序员来处理。
异常类的层次结构
Java 异常类的层次结构如下所示:
Throwable
|
|-----------|
| |
Error Exception
Error
Error
类表示严重错误,一般由 JVM 抛出,无法通过程序来恢复。常见的 Error
类包括 OutOfMemoryError
(内存溢出)、StackOverflowError
(栈溢出)等。当出现 Error
时,程序无法继续执行,需要重新启动 JVM。
Exception
Exception
类表示可恢复的异常,可以由程序员来处理。Exception
类有两个重要的子类:RuntimeException
和 IOException
。
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
方法中,我们