Java 的异常体系主要基于 Throwable 及其子类。
Throwable 有两个重要的子类:Error 和 Exception,它们分别代表了不同类型的异常情况。
-
Error(错误):表示运行环境的错误,错误是程序无法处理的严重问题,如虚拟机错误、动态链接库失效等。程序不应该尝试捕获这类错误。例如,
OutOfMemoryError、StackOverflowError等。 -
Exception(异常):表示程序本身可以处理的异常情况。异常分为两大类:
- 非运行时异常(受检异常,Checked Exception):这类异常在编译时就必须被捕获或者声明抛出。它们通常是外部错误,如文件不存在(
FileNotFoundException)、类未找到(ClassNotFoundException)等。非运行时异常强制程序员处理这些可能出现的问题,增强了程序的健壮性。 - 运行时异常(非受检异常,Unchecked Exception 或 RuntimeException):这类异常特指
RuntimeException及其子类。它与Error一起构成了 Java 中的非受检异常家族。运行时异常由程序逻辑错误导致,如空指针访问(NullPointerException)、数组越界(ArrayIndexOutOfBoundsException)等。运行时异常是不需要在编译时强制捕获或声明的。
- 非运行时异常(受检异常,Checked Exception):这类异常在编译时就必须被捕获或者声明抛出。它们通常是外部错误,如文件不存在(
异常处理有哪些?
- try-catch 语句块:用于捕获并处理可能抛出的异常。try 块中包含可能抛出异常的代码,catch 块用于捕获并处理特定类型的异常。可以有多个 catch 块来处理不同类型的异常。
try {
// 可能抛出异常的代码
} catch (ExceptionType 1 e 1) {
// 处理异常类型 1 的逻辑
} catch (ExceptionType 2 e 2) {
// 处理异常类型 2 的逻辑
} catch (ExceptionType 3 e 3) {
// 处理异常类型 3 的逻辑
} finally {
// 可选的 finally 块,用于定义无论是否发生异常都
}
- throw 语句:用于手动抛出异常。可以根据需要在代码中使用 throw 语句主动抛出特定类型异常
throw new ExceptionType("Exception message");
- throws 关键字:用于在方法声明中声明可能抛出的异常类型。如果一个方法可能抛出异常,但不想在方法内部进行处理,可以使用 throws 关键字将异常传递给调用者来处理。
public void methodName() throws ExceptionType {
// 方法体
}
- finally 块:用于定义无论是否发生异常都会执行的代码块。通常用于释放资源,确保资源的正确关闭。
try {
// 可能抛出异常的代码
} catch (ExceptionType e) {
// 处理异常的逻辑
} finally {
// 无论是否发生异常,都会执行的代码
}