通过短路避免异常

时间:2013-08-31 20:18:10

标签: java exception short-circuiting

以下代码没有错误。但是,只要if (i == a.length - 1 || a[i] != a[i + 1])条件维持其顺序,它就很好。将if条件交换到if(a[i] != a[i + 1] || i == a.length - 1)会引发异常。通过短路,可预期的编码标准来防止异常或是否存在针对此类编码实践的一些理论/设计模式警告?如果是这样,请告知链接/材料。

 public static void eliminateDuplicate(int[] a) {
    if (a == null) {
        throw new NullPointerException();
    }
    List<Integer> list = new ArrayList<Integer>();

    for (int i = 0; i < a.length; i++) {
        if (i == a.length - 1 || a[i] != a[i + 1]) {
            System.out.println("now what : " + a[i]);
            list.add(i);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

使用短路运算符来避免异常是一种常见做法。它显然是标准的。

JLS Section 15.24 - Conditional OR operator:

  

条件或运算符||运算符就像| (§15.22.2),但是   仅当左手操作数的值为左手时,才评估其右手操作数   操作数是假的。

     
      
  • ConditionalOrExpression:   
        
    • ConditionalAndExpression
    •   
    • ConditionalOrExpression || ConditionalAndExpression
    •   
  •   

根据您的情况,如果您使用Conditional && operator并将条件更改为:

,则会更加清楚
if (i < a.length - 1 && a[i] != a[i + 1])

首先看一下这段代码的意图。坦率地说,我必须经历两次你的状况才能弄清楚它在做什么。

再次与具体问题无关,我将修改你的for循环使用比你当前使用的最小索引少一个,以完全避免条件运算符:

for (int i = 0; i < a.length - 1; i++) {
    if (a[i] != a[i + 1]) {
        System.out.println("now what : " + a[i]);
        list.add(i);
    }
}

一些常见例子:

您可以看到使用条件运算符来避免异常的一些常见示例是:

覆盖equals()方法:

public boolean equals(Object obj) {
    return obj instanceof MyClass && ((MyClass)obj).num == this.num;
}

在某些方法调用中处理null引用:

// Although there are better way to do this.
if (str != null && str.equals(str2)) {
    // some code
}

避免除以零:

if (x != 0 && 4/x > 1) {
    // some code
}

与此相反,如果您使用Boolean Logical Operator,所有上述代码将在运行时抛出异常,并且第一个表达式的计算结果为false