Java 的异常处理机制是其语言特性之一,用于处理程序中可能出现的各种错误情况。Java 中的异常体系主要由 Java 标准类库中的 `java.lang.Throwable` 类及其子类构成。下面是一个简化的异常层次结构概述:
1. Throwable:
- 这是所有错误和异常的超类。
- Throwable 有两个直接子类:Exception 和 Error。
2. Exception:
- 这是所有用户可以捕获或抛出的异常的超类。
- Exception 又分为两个主要部分:运行时异常(RuntimeExceptions)和编译时异常(编译阶段出现的异常)。
①运行时异常:编译阶段不报错,运行出现的异常(数字操作异常、空指针异常、索引异常、)
②编译时异常:编译阶段报错,编译不通过(提醒代码可能出问题)。
异常的基本处理:
抛出异常(throws):将方法内部出现的异常抛出去。
public void checkAge(int age) throws IllegalArgumentException {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
// 正常逻辑
}
捕获异常(try....catch):`try` 块包含了可能会抛出异常的代码。如果 `try` 块中的代码抛出了一个异常,那么这个异常会被 `catch` 块捕获,并在那里处理。如果没有捕获到异常,则程序会继续执行 `try` 之后的代码。
try {
// 可能会抛出异常的代码
} catch (ExceptionType1 e) { // 捕获特定类型的异常
// 处理 ExceptionType1 异常
} catch (ExceptionType2 e) { // 捕获另一个类型的异常
// 处理 ExceptionType2 异常
}
finally 语句:`finally` 块总是被执行,无论是否发生异常。这使得 `finally` 成为一个释放资源的理想位置
try {
// 可能会抛出异常的代码
} catch (Exception e) {
// 处理异常
} finally {
// 总是会被执行的代码
}
异常的作用:
①用来定位程序bug的关键信息。
public class BugLocator {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
try {
int value = numbers[3]; // 数组越界
System.out.println("Value is " + value);
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught an exception: " + e.getMessage());
e.printStackTrace(); // 打印堆栈跟踪,帮助定位错误
}
}
}
②可以用作方法内部的一种特殊返回值。
throw new Exception("");