我一直试图弄清楚代码为什么一遍又一遍地给我一个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;
}
}
答案 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中开发代码,并在调试器中逐步执行。如果你不这样做,编程会变得更加困难。现在花时间学习如何做到这一点,你将成为一个更好的程序员。试试IntelliJ或Eclipse,它们是免费的。在调试器中逐步执行代码时进行谷歌搜索。
答案 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()函数而不是这个混乱。