1

以下代码没有错误。但是,只要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);
        }
    }
}
4

1 回答 1

2

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

JLS 第 15.24 节 - 条件 OR 运算符:

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

  • 条件或表达式:
    • 条件表达式
    • 条件或表达式 || 条件表达式

鉴于您的情况,如果您使用Conditional && 运算符并将您的条件更改为:

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
}

与此相反,如果您使用布尔逻辑运算符,上述所有代码都会在运行时抛出异常,并且第一个表达式的计算结果为false

于 2013-08-31T20:24:43.410 回答