第五十七条 只针对异常的情况才使用异常

异常,是java中不可绕过的一部分。善用异常,可以大大提高效率。但如果有一天,一不小心,遇到下面的代码

        try {
            int i = 0;
            while (true){
                range[i++].climb();
            }
        }catch (ArrayIndexOutOfBoundsException e){

        }

这段代码有什么用呢?我们仔细看了看,发现原来是要遍历数组元素,然后调用每个元素的 climb() 方法,但这个设计有点费解,并且不太符合常理。这段代码明显是想让数组一致遍历,直到边界,继续遍历,然后数组越界,此时被异常捕获,遍历终止。虽然也能达到目的,但这么做很容易引起人误解,并且方法也不规范,我们完全可以使用for循环来处理。

    for(ang m : range){
            m.climb();
        }

下面代码比着上面,有以下几个好处,一、异常机制是针对不正常的情景,jvm很少对它们进行优化;二、把代码放到try catch 中可能会阻止了jvm的部分优化;三、对数组遍历的标准模式性能很高,不用做无谓功。事实上,基于异常模式比标准模式要慢的多。随意使用异常,不仅模糊了代码的意图,减低了效率,甚至还可能隐藏真正的bug,比说说某些代码中,如果有元素为null,还调用对象的方法,则会报空指针,本应该判断,进行分流;但如果加入异常,则会隐藏了这部分逻辑。使用了异常,就应该当产生了与这个bug的异常时,会被捕捉到,然后循环终止,这才是异常的用法。

如果我们设计api时,良好的习惯是对外暴露方法,而非使用异常。
一、状态测试,提供是否可以调用这个状态的方法。例如:迭代器里,如果只有一个 next()方法提供下一个元素,但没有提供检测是否还有下一个元素,我们就只能通过元素个数或异常来终止遍历,如果提供了方法,则

        for (Iterator<String> i = collection.iterator(); i.hasNext(); ) {
            String s = i.next();
        }
 
这样,我们不用借助异常和辅助条件,只用自己的条件,就可以完美的实现功能。
二、 当状态方法被调用,返回值时,返回可识别的值,比如 null。我们不清楚外面的业务逻辑,所以将内部逻辑控制好,将数据暴露给外面,让使用者根据业务逻辑,进行自己的逻辑判断,完成功能。

异常是为了在异常情况下使用而设计的,不是为了普通控制使用的,切记。

猜你喜欢

转载自blog.csdn.net/Deaht_Huimie/article/details/83756518
今日推荐