我不明白以下java代码抛出ArrayIndexOutofBound异常的原因
while (intArray[j] < intArray[j - 1] && j > 0) {
int temp = intArray[j - 1];
intArray[j - 1] = intArray[j];
intArray[j] = temp;
j--;
}
看来,即使I AND(&amp;&amp;)两个条件,它也会先执行其中一个条件来检查它是否符合条件,在这种情况下,它将是intArray [0]&lt; intArray [-1]并导致超出异常。起初这让我很困惑,现在我只是徘徊,为什么程序会这样?
答案 0 :(得分:4)
从左到右评估条件,这意味着首先评估intArray[j] < intArray[j - 1]
。因此,如果j <= 0,您将获得异常。
将订单更改为
while (j > 0 && intArray[j] < intArray[j - 1]) {
将阻止异常(假设j的初始值不是太高)。
答案 1 :(得分:1)
应该是这样的:
while (j > 0 && intArray[j] < intArray[j - 1]) {
int temp = intArray[j - 1];
intArray[j - 1] = intArray[j];
intArray[j] = temp;
j--;
}
如果第一个条件j > 0
为假,则第二个条件未被评估(并且当然不会抛出任何异常)。
如果您使用单&
代替&&
,则条件的顺序并不重要,因为两者都会被评估,即使第一个是错误的。
修改
&
(按位AND操作)和&&
(条件AND)之间差异的简单示例
public class LogicalOperators {
public static void main(String[] args) {
int n = 0;
int k = 5;
if(n != 0 && k % n == 0) {
System.out.println(n + " is a divisor of " + k);
}
if(n != 0 & k % n == 0) {
System.out.println(n + " is a divisor of " + k); // throws ArithmeticException
}
}
}
答案 2 :(得分:1)
Java从左到右使用延迟评估。您可能会因为三个原因而获得此异常。
另外,你的循环应该考虑j&lt; intArray.length
无论如何,如果你试图实现一个下沉/泡泡算法,你的代码是错误的,它会在找到一对有序的元素后立即停止。并重复自己的恶心。
答案 3 :(得分:0)
当j的值变为1时,这将失败。它将在执行到最后一步后进入循环它将变为0.当它再次到达下一步时它将比较int [0]到int [ - 1]最终将抛出arrayindexout的绑定因为它将被评估为j> 0。