第69条:只针对异常的情况才使用异常

        观察如下两种代码:

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

//第二种
for (Mountain m : range) m.climb();

        两种实现的功能是一样的,但是第一种使用的是基于异常的循环,企图利用Java的错误判断机制来提高性能。事实上,基于异常的模式比标准模式要慢得多。基于异常的循环模式不仅模糊了代码的意图,降低了它的性能,而且它还不能保证正常工作!如果出现了不相关的Bug,这个模式会失效,从而掩盖这个Bug,增加调试的复杂性。异常应该只用于异常的情况下;它们永远不应该用于正常的控制流。

        设计良好的API不应该强迫它的客户端为了正常的控制流而使用异常。如果类具有“状态相关”(state-dependent)的方法,即只有在特定的不可预知的条件下才可以被调用的方法,这个类往往也应该有个单独的“状态测试”(state-testing)方法,即指示是否可以调用这个状态相关的方法。例如,Iterator接口有一个“状态相关”的next方法,及相应的状态测试方法hasNext。这使得利用传统的for循环(以及for-each循环,在内部使用了hasNext方法)对集合进行迭代的标准模式成为可能:

        

for (Iterator<Foo> i = collection.iterator();i.hasNext(); ) {
    Foofoo = i.next();
    ...
}
// 如果Iterator缺少hasNext方法,客户端将被迫改为下面的做法:
try {
    Iterator<Foo> i = collection.iterator();
    while (true) {
        Foo foo = i.next();
        ...
    } catch (NoSuchElementException e) {

}

        除了代码繁琐且令人误解之外,这个基于异常的模式可能执行起来也比标准模式更差。

        另一种做法是,如果“状态相关的”方法无法执行想要的计算,就让它返回一个零长度的optional值,或者返回一个可识别的值,比如null。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值