Java 如何处理 while 循环条件下的越界数组索引?

How does Java handle an out-of-bound array index in a while-loop condition?

提问人:TorusWithSprinkles 提问时间:1/25/2022 更新时间:1/25/2022 访问量:166

问:

我正在阅读双指针实现教程(本质上是 3Sum 的解决方案),我对这种搜索方法中的第二个 while 循环感到困惑:

  private static void searchPair(int[] arr, int targetSum, int left, List<List<Integer>> triplets) {

    int right = arr.length - 1;
    
    while (left < right) {
        int currentSum = arr[left] + arr[right];

        if (currentSum == targetSum) { // found the triplet
            triplets.add(Arrays.asList(-targetSum, arr[left], arr[right]));
            left++;
            right--;

            while (left < right && arr[left] == arr[left - 1])
              left++; // skip same element to avoid duplicate triplets
            while (left < right && arr[right] == arr[right + 1])
              right--; // skip same element to avoid duplicate triplets
      
    } else if (targetSum > currentSum)
        left++; // we need a pair with a bigger sum
      else
        right--; // we need a pair with a smaller sum
  }
}

while (左 < 右 && arr[右] == arr[右 + 1])

这不会是越界异常,因为是最后一个索引,所以会越界吗?但是代码运行良好,所以我很困惑。Java 如何处理这种情况?rightright + 1

java while 循环 indexOutofboundsException 数组IndexOutofBoundsException

评论

1赞 Scary Wombat 1/25/2022
int right = arr.length - 1;然后right--;
0赞 Jeff Holt 1/25/2022
“那就了——”它在任何时候都不会超出最后一个元素。由于没有仔细阅读代码,我不知道是否会小于零。i

答:

0赞 vjh 1/25/2022 #1

Java 按顺序处理 &&。这意味着,如果左<右失败(即它是最后一个元素),则根本不计算条件的第二部分。