205. Java 异常 - Exception 类:表示程序运行中的可恢复问题
在 Java 中,大多数程序会抛出和捕获 Exception 类的对象。Exception 表示程序运行过程中发生的问题,但这些问题通常不会影响系统的正常运行。与 Error 不同,Exception 表示的是可以被处理的错误,程序通常能够恢复或继续执行。
1. Exception 类的继承关系
Exception 是 Throwable 类的子类之一。Java 定义了许多 Exception 类的子类,表示不同类型的异常。与 Error 类相比,Exception 更常用于应用程序中,它表示程序可以捕获并进行处理的问题。
java.lang.Object
└─ java.lang.Throwable
└─ java.lang.Exception
├─ IOException
├─ SQLException
├─ IllegalArgumentException
├─ NullPointerException
├─ ……(其他异常)
2. Exception 类的常见子类
IOException:表示输入输出操作失败或中断,例如读取文件时发生错误。SQLException:表示与数据库交互时发生的错误,如数据库连接失败。IllegalArgumentException:表示方法接收到非法的参数值。NullPointerException:表示试图访问或操作一个空对象的引用。
3. RuntimeException 类:程序错误的特殊标志
RuntimeException 是 Exception 的一个重要子类,专门用于表示程序中的编程错误或不当的 API 使用。运行时异常通常指示程序错误,如空指针引用、数组越界等。与其他 Exception 不同,RuntimeException 是 unchecked exception,意味着它不需要在方法签名中声明,也不需要在代码中捕获。
常见的 RuntimeException 子类
NullPointerException:试图通过 null 引用访问对象成员时抛出。ArrayIndexOutOfBoundsException:当数组索引越界时抛出。IllegalStateException:当方法被调用时,程序的状态不符合预期,通常是 API 使用错误。
4. 示例:NullPointerException
public class NullPointerDemo {
public static void main(String[] args) {
String str = null;
// 尝试调用 null 引用的方法,抛出 NullPointerException
System.out.println(str.length());
}
}
在上面的代码中,str 被赋值为 null,然后尝试调用 str.length(),这会抛出 NullPointerException,因为 str 是 null,无法访问其成员。
5. 示例:IllegalArgumentException
public class IllegalArgumentDemo {
public static void main(String[] args) {
// 使用非法参数调用方法,抛出 IllegalArgumentException
setAge(-1);
}
public static void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative.");
}
System.out.println("Age is: " + age);
}
}
在这个示例中,setAge 方法被调用时,传入了一个非法的负数参数。由于年龄不能为负数,方法抛出了一个 IllegalArgumentException,提示用户传入的参数不合法。
6. 为什么不推荐抛出 RuntimeException
尽管 Java 提供了运行时异常 RuntimeException,但在实际开发中,过度使用或随意抛出运行时异常是不推荐的做法。许多开发者认为,运行时异常指示着程序员的错误,而不是程序本身应该处理的异常。
例如,使用 RuntimeException 作为参数验证的机制或在预期错误情况下抛出运行时异常,都可能会导致程序的可维护性降低。因此,建议仅在必要时使用运行时异常,尤其是在表示程序逻辑错误或不当API 使用的情况下。
7. 总结
Exception:表示程序执行过程中可恢复的错误,通常可以通过异常处理来恢复程序的正常执行。RuntimeException:专门表示API使用不当或程序逻辑错误,属于未经检查的异常(unchecked exception),无需在方法签名中声明。- 常见子类:
IOException、SQLException、NullPointerException等,帮助开发者更细致地捕获并处理不同类型的异常。
通过理解 Exception 类及其子类的使用,我们可以更加灵活地处理程序中的错误,确保程序的健壮性和可维护性。