5.5 创建异常类

需要抛出异常的类型时,可以选择使用由别人编写的异常(Java平台提供了许多可以使用的异常类),或者使用自己编写的异常类。在做出抉择的时候,先考虑以下问题:

· 你需要一个Java平台中没有的异常类型吗?

· 用户能够区分你的异常与由其他供应商编写的类抛出的异常吗?

· 你的代码是否抛出不止一个相关的异常?

· 如果使用他人的异常,那么用户是否可以访问这些异常?

如果对上面任何问题的回答都是“是”,就应该编写自己的异常类;否则,建议使用现有的异常类。

5.5.1 一个创建异常类的例子

假设正在写一个链表类,该类支持以下方法:

· objectAt(int n):返回列表中第n个位置的对象。如果参数小于0或大于当前列表中的对象数,就抛出异常。

· firstObject():返回列表中的第一个对象。如果列表不包含对象,就抛出异常。

· indexOf(Object o):搜索指定对象的列表,并返回其在列表中的位置。如果传入方法的对象不在列表中,就抛出异常。

链表类可以抛出多个异常,使用一个异常处理程序捕获链表所抛出的所有异常是很方便的。同时,所有相关代码都应打包在一起。因此,链表应该提供自己的一组异常类。

图5-3给出了链表抛出异常的一个可能的类层次结构。

图5-3 类层次结构

5.5.2 选择超类

任何Exception子类都可以用作LinkedListException的父类。然而,这些子类有些是专用的,有些又与LinkedListException完全无关。因此,LinkedListException的父类应该是Exception。

开发人员大多数情况下所编写的应用程序都会抛出Exception对象。Error通常用于系统中严重的硬错误,开发人员一般不做捕获。