专家级程序员与缺乏经验的程序员一个最主要的区别在于,专家追求并且通常也能够实现高度的代码重用。代码重用是值得提倡的,这是一条通用的规则,异常也不例外。java平台类库提供了一组基本的未受检的异常,它们满足了绝大多数API的异常抛出需要。本条目中,我们将讨论这些常见的可重用异常。
重用现有的异常有多方面好处。其中最主要的好处,它使你的API更加易于学习和使用,因为它与程序员已经熟悉度习惯用法是一致的。第二个好处是,对于用到这些API的程序而言,它们的可读性会更好,因为它们不会出现很多程序员不熟悉的异常。最后一点是,异常类越少,意味着内存印迹就越小,装载这些类的时间开销也越少。
最经常被重用的异常是Illegalargumentexception。当调用者传递的参数不合适的时候,往往就会抛出这个异常。例如,假设一个参数代表了“某个动作的重复次数”,如果程序员给这个参数传递了一个负数,就会抛出这个异常。
另一个经常被重用的异常IllegalStateException。如果因为接收对象的状态而使调用非法,通常就会抛出这个异常。例如,如果在某个对象被正确地初始化之前,调用者就企图使用这个对象,就会抛出这个异常。
可以这么说,所有的错误的方法调用可以被归结为非法参数或非法状态,但是,其他还有一些标准异常也被某些特定情况下的非法参数和非法状态。如果调用者在某个不允许null值的参数中传递了null ,习惯的做法就是抛出NullPointerException,而不是IllegalArgumentException。同样地,如果调用者在表示序列下标的参数中传递了越界的值,应该抛出的就是IndexOutOfBoundsException,而不是IllegalArgumentexception。
另一个值得了解的通用异常是ConcurrentModificationException.如果一个对象被设计为专用于单线程或者外部同步机制配合使用,一旦发现它正在(已经)被并发地修改,就应该抛出这个异常。
最后一个值得注意的通用异常是UnsupportedOperationException。如果对象不支持所请求的操作,就会抛出这个异常。
最常见的可重用异常
| 异常 | 使用场合 |
|---|---|
| illegalargumentexception | 非null的参数不正确 |
| IllegalStateException | 对于方法调用而言,对象状态不合适 |
| NullPointerException | 在禁止使用null的情况下参数值为null |
| IndexOutOfBoundsException | 下标参数值越界 |
| ConcurrentModificationException | 在禁止并发修改的情况下,检测到对象的并发修改 |
| UnsupportedOperationException | 对象不支持用户请求的方法 |
选择重用哪个异常并不总是那么精确,因为以上使用场合并不是相互排斥的。