Java如何处理&&在if语句中

时间:2015-06-21 17:35:37

标签: java if-statement

我不明白以下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]并导致超出异常。起初这让我很困惑,现在我只是徘徊,为什么程序会这样?

4 个答案:

答案 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 <0,则intArray [j]将抛出异常
  • 如果j <1则intArray [j-1]将抛出异常
  • 如果j&gt; = intArray.length,则intArray [j]将抛出异常。

另外,你的循环应该考虑j&lt; intArray.length

无论如何,如果你试图实现一个下沉/泡泡算法,你的代码是错误的,它会在找到一对有序的元素后立即停止。并重复自己的恶心。

答案 3 :(得分:0)

当j的值变为1时,这将失败。它将在执行到最后一步后进入循环它将变为0.当它再次到达下一步时它将比较int [0]到int [ - 1]最终将抛出arrayindexout的绑定因为它将被评估为j> 0。