有人可以解释我的while循环中的错误

时间:2013-12-26 17:12:40

标签: java

我一直试图弄清楚代码为什么一遍又一遍地给我一个arrayIndexOutOfBoundsException。出于绝望的尝试,我在我的while循环中颠倒了2个布尔条件,程序工作正常。这让我感到困惑的原因是因为这两个条件是由一个AND子句分开的,它应该是可交换的。

以下是有问题的while语句:

while(compareIndex>=0 && key<data[compareIndex])//works
while(key<data[compareIndex] && compareIndex>=0) //Crashes

对于某些上下文,这里是方法体的其余部分:

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

}

6 个答案:

答案 0 :(得分:4)

int compareIndex = i-1; // <-- on the first iteration i = 0, and i-1 = -1
while(key<data[compareIndex] && compareIndex>=0)

您无法使用-1

索引数组

SIDE注意: 您应该在IDE中开发代码,并在调试器中逐步执行。如果你不这样做,编程会变得更加困难。现在花时间学习如何做到这一点,你将成为一个更好的程序员。试试IntelliJEclipse,它们是免费的。在调试器中逐步执行代码时进行谷歌搜索。

答案 1 :(得分:3)

崩溃是因为你做的时候:

while(key<data[compareIndex] && compareIndex>=0) //Crashes

compareIndex的关键值是i-1 = 0-1 = -1

这不是有效的数组位置。 当你尝试相反的方式时,compareIndex&gt; = 0返回false,因此根本不检查语句的第二部分。

答案 2 :(得分:1)

当i == 0时,在第一个循环上,compareIndex的值为-1。当您尝试访问数据[-1]时,会得到一个ArrayIndexOutOfBounds。

当你这样做时

while(compareIndex>=0 && key<data[compareIndex])

作为compareIndex&gt; = 0为假,代码从不尝试做评估密钥&lt;数据[compareIndex]。

但是当你做的时候

while(key<data[compareIndex] && compareIndex>=0)

它试图评估密钥

答案 3 :(得分:1)

compareIndex为-1,所以当你这样做时

data[compareIndex] 

崩溃是因为-1不是有效索引。


以下不会崩溃的原因是因为快捷方式

while(compareIndex>=0 && key<data[compareIndex])//works

它从左到右评估子句,因此它首先评估compareIndex>=0,然后在它之后,你的谓词如下所示

while(false && something_else)

无论如何,总是保证为false,因此编译器甚至不会打扰data[compareIndex]部分,这就是使它崩溃的原因。

答案 4 :(得分:1)

代码while(key<data[compareIndex] && compareIndex>=0)崩溃的原因是因为首先计算了数组compareIndex中索引data的值,但由于索引超出了数组{{1}的范围}。

另一方面,当你使用data时,首先计算while(compareIndex>=0 && key<data[compareIndex])的结果,如果它是假的(就像你的情况那样),则不检查下一个条件。 / p>

答案 5 :(得分:0)

数组不能带负索引。在某些情况下,例如C ++ GLUT,它不介意'减',所以你可以编写数组[0] [ - 1]并忽略负数并将其视为数组[0] [1]。 (当我使用过剩的c ++编程时,我面对它)。因此,java是敏感的,您需要在进行操作之前检查索引。另外我可以看到,这是泡泡分类。也许检查Arrays.sort()函数而不是这个混乱。