异常

1 异常是为了在异常情况下使用而设计的。不要将它们用于普通的控制流。

2 Java提供了三种可抛出结构:受检异常、运行时异常和错误。其中后两者称为未受检异常。
使用原则:
  (1)如果期望调用者能够适当恢复,对于这种情况就应该使用受检的异常。对于这样的异常,提供一些辅助方法尤为重要,通过这些方法,调用者可以收获一些有助于恢复的信息。例如,用于欠费,企图呼叫,这是可以抛出受检异常,提供用于查询所欠费用的方法,从而将这个数字传递给客户。
  (2)对于未受检异常,这种异常往往表明这属于不可恢复的情形,再执行下去有害无益。如果程序没有捕捉这种可抛出结构,将会导致当前线程停止,并出现适当的错误信息。
  (3)用运行时异常表明程序错误。大多数的运行时异常都表示前提违例。所谓前提违例是指API的客户没有遵循API规范建立的约定。如数组越界。

努力使失败保持原子性
途径:
 (1)设计一个不可变的对象
 (2)对于可变对象,获得失败原子性最常见的方法是,在执行操作之前检查参数的有效性。这可以使得对象的状态被修改之前,先抛出适当的异常。例如:

    public Object pop(){
        if(size==0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size]=null;
        return result;
} 
如果取消对size的检查,当这个方法企图弹出一个空栈时将抛出异常。然而,这将会导致size域保持在不一致的状态之中(负数)。

  作为方法规范的一部分,产生的任何异常都应该让对象保持在该方法调用之前的状态。如果违反这条规定,API文档应该清楚地指明对象将会处于什么样的状态。

4 最常见的可重用异常

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

常见的运行时异常
这里写图片描述
常见的非运行时异常
这里写图片描述 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章