国庆期间技术精进07:优先使用标准的异常

167 阅读3分钟

专家级程序员与缺乏经验的程序员一个最主要的区别在于,专家追求并且通常也能够实现高度的代码重用。代码重用是值得提倡的,这是一条通用的规则,异常也不例外。java平台类库提供了一组基本的未受检的异常,它们满足了绝大多数API的异常抛出需要。本条目中,我们将讨论这些常见的可重用异常。

重用现有的异常有多方面好处。其中最主要的好处,它使你的API更加易于学习和使用,因为它与程序员已经熟悉度习惯用法是一致的。第二个好处是,对于用到这些API的程序而言,它们的可读性会更好,因为它们不会出现很多程序员不熟悉的异常。最后一点是,异常类越少,意味着内存印迹就越小,装载这些类的时间开销也越少。

最经常被重用的异常是Illegalargumentexception。当调用者传递的参数不合适的时候,往往就会抛出这个异常。例如,假设一个参数代表了“某个动作的重复次数”,如果程序员给这个参数传递了一个负数,就会抛出这个异常。

另一个经常被重用的异常IllegalStateException。如果因为接收对象的状态而使调用非法,通常就会抛出这个异常。例如,如果在某个对象被正确地初始化之前,调用者就企图使用这个对象,就会抛出这个异常。

可以这么说,所有的错误的方法调用可以被归结为非法参数或非法状态,但是,其他还有一些标准异常也被某些特定情况下的非法参数和非法状态。如果调用者在某个不允许null值的参数中传递了null ,习惯的做法就是抛出NullPointerException,而不是IllegalArgumentException。同样地,如果调用者在表示序列下标的参数中传递了越界的值,应该抛出的就是IndexOutOfBoundsException,而不是IllegalArgumentexception。

另一个值得了解的通用异常是ConcurrentModificationException.如果一个对象被设计为专用于单线程或者外部同步机制配合使用,一旦发现它正在(已经)被并发地修改,就应该抛出这个异常。

最后一个值得注意的通用异常是UnsupportedOperationException。如果对象不支持所请求的操作,就会抛出这个异常。

最常见的可重用异常

异常 使用场合
illegalargumentexception 非null的参数不正确
IllegalStateException 对于方法调用而言,对象状态不合适
NullPointerException 在禁止使用null的情况下参数值为null
IndexOutOfBoundsException 下标参数值越界
ConcurrentModificationException 在禁止并发修改的情况下,检测到对象的并发修改
UnsupportedOperationException 对象不支持用户请求的方法

选择重用哪个异常并不总是那么精确,因为以上使用场合并不是相互排斥的。