首页 > 解决方案 > 即使将新数组长度设置为旧数组长度,也会出现 ArrayIndexOutOfBoundsException

问题描述

这是 CodingBat.com 上的一个问题,“frontPiece”。正如对问题的解释,返回应该是原始数组的前两个元素的数组。那没问题。但是,一些极端情况是一个空数组和一个元素的数组。这是我遇到一些错误的地方。

要做到这一点,最简单的方法是为每个边缘情况都有一个 IF 语句。这对我来说似乎很容易,我做这些练习的一个原因是学习新工具,比如增强的 FOR 循环。

  if(nums.length < 2){
    int[] answer = new int[nums.length];
    for(int x: nums){
      answer[x] = nums[x];
    }
    return answer;
  }else{
    int[] answer = new int[2];
    answer[0] = nums[0];
    answer[1] = nums[1];
    return answer;
  }
} ```

大多数输入数组将无法通过 IF 语句,直至代码的 ELSE 部分中新数组的声明和填充。一个空数组会导致创建并返回一个空数组,同时也会通过。该错误带有一个大小为 1 的数组。

我(可能不充分)对增强的 FOR 或 FOR EACH 循环的理解是,它逐步遍历数组,为其中的每个元素执行下面的代码块。我原以为将 ANSWER 数组的长度设置为原始 NUMS 数组的长度可以防止出现 OOB 错误。

任何帮助表示赞赏。提前致谢。

标签: javaarraysforeach

解决方案


在这个循环中

for(int x: nums)

您不是遍历数组的索引而是遍历值因此如果值大于您超出数组边界numsnums.length

例如:

int nums[] = new int[]{1000};

然而nums.length1在 for-each 循环的第一次迭代中,您将尝试访问answer[1000]nums[1000]


对于此类复制,您应该使用for(;;)循环版本甚至更好的Arrays.copyOf()方法


推荐阅读