Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中计算带有逻辑运算符的表达式?_Java - Fatal编程技术网

如何在Java中计算带有逻辑运算符的表达式?

如何在Java中计算带有逻辑运算符的表达式?,java,Java,我一直在尝试用Java实现插入排序,但在我的程序中遇到了一个奇怪的错误。执行插入的while循环具有以下条件: while (arr[j] > key && j>=0) 当j键&&j>=0时,循环因ArrayIndexOutOfBoundsException而崩溃{ arr[j+1]=arr[j]; j=j-1; } arr[j+1]=键; } 返回arr; } } 公共类InsertionSort{ 公共静态void main(字符串[]args){ System

我一直在尝试用Java实现插入排序,但在我的程序中遇到了一个奇怪的错误。执行插入的
while
循环具有以下条件:

while (arr[j] > key && j>=0)
j键&&j>=0时,循环因
ArrayIndexOutOfBoundsException
而崩溃{ arr[j+1]=arr[j]; j=j-1; } arr[j+1]=键; } 返回arr; } } 公共类InsertionSort{ 公共静态void main(字符串[]args){ System.out.println(“就是它”); int[]测试={54,68,92,3565,8,7,64,0}; 排序lort=新排序(); lort.分类(测试); for(int a:测试) 系统输出打印项次(a); } }
在尝试访问数组索引之前,检查数组索引是否有效非常重要。Java先计算
&&
的左侧,再计算右侧。如果先检查
arr[j]>键
,则不知道
j
是否为有效索引,因为这是
j>=0
检查的内容

当您交换顺序并写入
j>=0&&array[j]>键
时,如果
j
为非负,则它将仅访问
array[j]
。如果为负,则循环立即停止。永远不会访问无效索引,从而避免了异常

进一步阅读:

      • j
        点击-1时,这:

        while(arr[j]>键和&j>=0)

        计算第一部分,并
        arr[-1]
        抛出
        ArrayIndexOutOfBoundsException


      • j
        点击-1时,这:

        而(j>=0&&…

        永远不要尝试访问
        arr[-1]
        ,因为这是一个
        运算符,第一个条件为false就足以结束计算。第二个条件不相关,因此不会在运行时执行。这样可以避免试图从Java数组的
        [-1]
        位置读取数据

        有些人说这是手术被诅咒了,莱纳斯Turvald会在你的余生中显示你的C++有多么坏。
        • 布尔运算符(
          &&
          |
          )是“短路”。这意味着:一旦答案明确无误,他们就会立即放弃他们正在做的事情

          特别是,这意味着
          somethingtheatevalstofalse&&foo
          导致
          foo
          甚至没有被评估-
          false&&anything
          是false,因此,没有意义。这同样适用于
          something theatevalstorue | | foo
          -
          true | |任何东西
          都必须是真的,因此,
          foo
          无需评估以提供答案

          如果
          foo
          有副作用,这是相关的
          array[j]>key
          的副作用是,如果
          j
          为负数或超过数组大小,它将抛出AIOBEx。如果发生短路,则不计算整个表达式


          Java语言规范涵盖了这一点,但我不建议通过阅读语言规范来学习Java。这应该是教程中的一章。

          你的意思是说第一个版本由于
          ArrayIndexOutOfBoundsException而崩溃,而第二个版本没有?这是有道理的。@JohnKugelman是的,你是对的。
          
          while (j >= 0 && arr[j] > key)
          
          //Insertion Sort
          
          class Sort {
              public int[] sort(int[] arr) {
                  for (int i = 1; i < arr.length; i++) {
                  int j = i - 1;
                  int key = arr[i];
          
                  while (arr[j] > key && j>=0) {
                      arr[j + 1] = arr[j];
                      j = j - 1;
                  }
                  arr[j + 1] = key;
              }
              return arr;
              }
          }
          
          public class InsertionSort {
              public static void main(String[] args) {
                  System.out.println("THis is it");
                  int[] test = { 54, 68, 92, 3, 565, 8, 7, 64, 0 };
                  Sort lort = new Sort();
                  lort.sort(test);
                  for (int a : test)
                      System.out.println(a);
              }
          }