208. Java 异常 - 创建异常类
在编程过程中,有时我们需要抛出异常以应对特定的错误情形。虽然 Java 提供了丰富的异常类,通常可以满足大部分需求,但有时候我们需要创建自己的异常类,以更好地处理程序中的特定情况。
什么时候需要创建自定义异常类?
你可能会遇到以下情形,适合创建自定义异常类:
- 需要一个 Java 平台没有提供的异常类型:如果现有的异常类型无法准确描述你的错误情况,就可以考虑定义自己的异常类。
- 帮助用户区分你的异常和其他库的异常:当你编写的代码被其他开发者使用时,创建自定义异常可以让他们更清楚地辨别你抛出的错误。
- 抛出多种相关异常时:如果你的方法会抛出多种类型的异常,而这些异常是密切相关的,使用自定义异常可以帮助更好地组织代码。
- 包独立性:如果你的包应当是自包含的,并且不依赖于外部包的异常类型,你可能需要定义自己的异常。
示例:链表类的自定义异常
假设你正在编写一个链表类,链表类有多个方法,例如:
objectAt(int n):返回链表中第n个位置的对象。如果n小于0或大于链表中的元素个数,则抛出异常。firstObject():返回链表中的第一个对象。如果链表为空,则抛出异常。indexOf(Object o):在链表中查找指定对象并返回它的位置。如果链表中没有该对象,则抛出异常。
在这个例子中,链表类抛出的异常可能是多个不同类型的异常,但为了简化异常处理,你可以选择创建一个统一的异常类层次结构,来捕获所有与链表相关的异常。
设计异常类层次结构
你可以设计一个新的异常类 LinkedListException,作为所有链表相关异常的基类。然后,继承 LinkedListException 创建不同的子类来表示链表中的不同错误类型:
LinkedListException (父类)
├── IndexOutOfBoundsLinkedListException (表示索引越界的异常)
├── EmptyListException (表示链表为空的异常)
└── ObjectNotFoundException (表示未找到对象的异常)
选择超类
在创建 LinkedListException 类时,你可以选择将其继承自 Exception 类。Exception 类是所有受检异常的父类,通常在应用程序中用于表示程序错误。相比之下,Error 类通常用于表示严重的系统错误,例如虚拟机崩溃等,通常不需要处理。
示例代码
// 自定义的链表异常类
public class LinkedListException extends Exception {
public LinkedListException(String message) {
super(message);
}
}
// 子类:表示索引越界的异常
public class IndexOutOfBoundsLinkedListException extends LinkedListException {
public IndexOutOfBoundsLinkedListException(String message) {
super(message);
}
}
// 子类:表示链表为空的异常
public class EmptyListException extends LinkedListException {
public EmptyListException(String message) {
super(message);
}
}
// 子类:表示未找到对象的异常
public class ObjectNotFoundException extends LinkedListException {
public ObjectNotFoundException(String message) {
super(message);
}
}
使用自定义异常
在链表类的方法中,当遇到错误时,可以抛出相应的自定义异常:
public class LinkedList {
private Object[] list;
private int size;
// 获取指定位置的对象
public Object objectAt(int n) throws IndexOutOfBoundsLinkedListException {
if (n < 0 || n >= size) {
throw new IndexOutOfBoundsLinkedListException("Invalid index: " + n);
}
return list[n];
}
// 获取链表中的第一个对象
public Object firstObject() throws EmptyListException {
if (size == 0) {
throw new EmptyListException("The list is empty.");
}
return list[0];
}
// 查找对象的索引
public int indexOf(Object o) throws ObjectNotFoundException {
for (int i = 0; i < size; i++) {
if (list[i].equals(o)) {
return i;
}
}
throw new ObjectNotFoundException("Object not found: " + o);
}
}
总结
- 创建自定义异常类 可以帮助你更清楚地表达代码中的错误逻辑,尤其是当现有的异常类无法满足需求时。
- 自定义异常类通常继承自
Exception类,创建层次结构时建议使用具有描述性的类名,以增强代码的可读性。 - 在设计自定义异常类时,可以考虑异常类型的相关性,以便捕获所有相关的异常并进行统一处理。
通过这种方式,你可以使异常处理更加结构化,并在开发和维护过程中提高代码的可读性和可维护性。