Java如何处理&&;内部if语句

Java如何处理&&;内部if语句,java,if-statement,Java,If Statement,我不理解下面的java代码抛出ArrayIndexOutofBond异常的原因 while (intArray[j] < intArray[j - 1] && j > 0) { int temp = intArray[j - 1]; intArray[j - 1] = intArray[j]; intArray[j] = temp; j--; } while(intArray[j]0)

我不理解下面的java代码抛出ArrayIndexOutofBond异常的原因

    while (intArray[j] < intArray[j - 1] && j > 0) {
        int temp = intArray[j - 1];
        intArray[j - 1] = intArray[j];
        intArray[j] = temp; 
        j--;
    }
while(intArray[j]0){
内部温度=内部温度[j-1];
intArray[j-1]=intArray[j];
intArray[j]=温度;
j--;
}

看起来,即使I和(&&)都是条件,它也会首先执行其中一个条件以检查它是否符合条件,在这种情况下,它将是intArray[0] 从左到右评估条件,这意味着首先评估
intArray[j]
。因此,如果j从左到右评估条件,这意味着首先评估
intArray[j]
。因此,如果j应该是这样的:

while (j > 0 && intArray[j] < intArray[j - 1]) {
        int temp = intArray[j - 1];
        intArray[j - 1] = intArray[j];
        intArray[j] = temp; 
        j--;
    }
应该是这样的:

while (j > 0 && intArray[j] < intArray[j - 1]) {
        int temp = intArray[j - 1];
        intArray[j - 1] = intArray[j];
        intArray[j] = temp; 
        j--;
    }

当j的值变为1时,此操作将失败。它将在执行到最后一步后进入循环,它将变为0。当它再次进入下一步时,它会将int[0]与int[-1]进行比较,这最终会使ArrayIndex超出范围,因为它将在j>0之前得到计算。

当j的值变为1时,这将失败。它将在执行到最后一步后进入循环,它将变为0。当它再次进入下一步时,它会将int[0]与int[-1]进行比较,这最终会使ArrayIndex超出范围,因为它将在j>0之前得到计算。

Java使用从左到右的惰性计算。您获得此异常可能有三个原因


  • 如果jJava从左到右使用惰性求值。您获得此异常可能有三个原因


    • 如果jis,它总是从左到右计算?还是依赖Java编译器?@shanwu,不仅适用于Java,也适用于所有语言。是的,从左到右。它总是从左到右计算吗?还是依赖Java编译器?@shanwu,不仅适用于Java,也适用于所有语言。是的,从左到右。为什么使用
      while
      语句?在这种情况下,您可以使用
      @Andrew Tobilko的
      ,这是我的插入排序练习演示代码的一部分。为什么使用
      while
      语句?在这种情况下,您可以使用
      @Andrew Tobilko的
      ,这是我的插入排序练习演示代码的一部分。你能给我举个例子吗?我以为“&”代表位运算……你能给我举个例子吗?我以为“&”是位运算…实际上,它是插入排序。。。完整代码如下:Ok。请注意&&不同于&。第二个将在条件内执行每个操作,而第一个将在发现错误后立即停止。与| |和|相同,第一个将在找到真实条件后立即停止。实际上,它是插入排序。。。完整代码如下:Ok。请注意&&不同于&。第二个将在条件内执行每个操作,而第一个将在发现错误后立即停止。与| |和|相同,第一个将在找到真实条件后立即停止
      
      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
              }
          }
      }