数组索引超出范围未触发

时间:2016-01-09 20:57:26

标签: java

public static void insertionSort(int[] data) {
    for (int i =0; i < data.length; i++) {
        int current = data[i];
        int j = i-1;
        while (j >=0 && data[j] >= current) {
            data[j+1] = data[j];
            j--;
        }
        data[j+1] = current;
    }
}

while(j> = 0&amp;&amp; data [j]&gt; = current)这一行应首次在data [-1]时抛出边界的数组索引。我不明白为什么不这样做。请有人帮忙 谢谢 Ashok Pappu

2 个答案:

答案 0 :(得分:1)

如果可以更早地满足条件,那么这些布尔表达式永远不会被完全评估。

所以...在你的情况下,j >= 0falsefalse && ???始终为false,第二部分不需要进行评估。这就是永远不会调用data[-1]的原因。

您可以对null检查使用相同的原则,例如

if (object != null && object.isSomething())

答案 1 :(得分:0)

如果while子句包含多于1个表达式,由&&分割,则它们将逐个执行。这样做是为了提高性能。 即首先在您的代码j >= 0中进行检查。如果j < 0,则为假。因此,无论第二个表达式如何,循环都将被中断。