即使将新数组长度设置为旧数组长度,也要获取ArrayIndexOutOfBoundsException

时间:2019-08-31 09:40:24

标签: java arrays foreach

这是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错误。

感谢您的帮助。预先感谢。

1 个答案:

答案 0 :(得分:0)

在此循环中

lib

您没有遍历for(int x: nums) 数组的 indexes ,而是遍历了 values ,因此,如果值大于nums,您将无法使用数组边界

例如:

nums.length

在for-each循环的第一次迭代中,int nums[] = new int[]{1000}; nums.length,您将尝试访问1answer[1000]


对于这种复制,您应该使用nums[1000]版的循环或更好的for(;;)方法