让我用生动的例子来解释Java的异常体系:
想象你在开车,可能遇到的问题就像Java的异常:
- RuntimeException(运行时异常)就像是由于驾驶员自身原因造成的问题:
// 空指针异常:就像开车时闭着眼睛
String str = null;
str.length(); // 抛出 NullPointerException
// 数组越界:就像车开出道路边界
int[] array = new int[3];
array[5] = 1; // 抛出 ArrayIndexOutOfBoundsException
// 类型转换异常:就像把摩托车当成汽车开
Object obj = new Integer(1);
String str = (String)obj; // 抛出 ClassCastException
// 算术异常:就像以零速度计算行驶时间
int result = 10 / 0; // 抛出 ArithmeticException
- 检查型异常(其他异常)就像是外部环境造成的问题,必须提前考虑处理方案:
try {
// 文件未找到异常:就像导航找不到目的地
FileInputStream file = new FileInputStream("不存在的文件.txt");
// IO异常:就像遇到道路施工封路
file.read();
// SQL异常:就像加油站系统故障
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
} catch (FileNotFoundException e) {
// 处理文件未找到的情况
System.out.println("找不到文件,请检查路径");
} catch (IOException e) {
// 处理IO异常
System.out.println("读取文件失败");
} catch (SQLException e) {
// 处理SQL异常
System.out.println("数据库连接失败");
}
- 自定义异常就像制定自己的行车规则:
// 自定义检查型异常
class SpeedTooHighException extends Exception {
public SpeedTooHighException(String message) {
super(message);
}
}
// 自定义运行时异常
class FuelEmptyException extends RuntimeException {
public FuelEmptyException(String message) {
super(message);
}
}
class Car {
private int speed;
private int fuel;
public void accelerate(int speed) throws SpeedTooHighException {
if (speed > 200) {
throw new SpeedTooHighException("速度超过200km/h,太危险了!");
}
this.speed = speed;
}
public void drive() {
if (fuel <= 0) {
throw new FuelEmptyException("没油了,请加油!");
}
// 继续行驶
}
}
异常处理的最佳实践:
public class ExceptionHandlingDemo {
public void demonstrateExceptionHandling() {
try {
// 可能抛出异常的代码
riskyOperation();
} catch (IllegalArgumentException e) {
// 具体异常处理
System.out.println("参数不正确: " + e.getMessage());
} catch (Exception e) {
// 通用异常处理
System.out.println("发生未预期的错误: " + e.getMessage());
} finally {
// 清理工作,一定会执行
System.out.println("清理资源");
}
}
}
记住以下要点:
-
RuntimeException(运行时异常)
- 不需要强制处理
- 通常是程序逻辑问题
- 应该通过代码逻辑避免
-
检查型异常
- 必须处理或声明throws
- 通常是外部环境问题
- 需要合理的异常处理机制
-
异常处理原则
- 只捕获可以处理的异常
- 尽早抛出,尽晚捕获
- finally块用于清理资源