java - 即使将新数组长度设置为旧数组长度,也会出现 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 错误。
任何帮助表示赞赏。提前致谢。
解决方案
在这个循环中
for(int x: nums)
您不是遍历数组的索引而是遍历值,因此如果值大于您超出数组边界nums
nums.length
例如:
int nums[] = new int[]{1000};
然而nums.length
,1
在 for-each 循环的第一次迭代中,您将尝试访问answer[1000]
和nums[1000]
对于此类复制,您应该使用for(;;)
循环版本甚至更好的Arrays.copyOf()
方法
推荐阅读
- javascript - Phaser 3全面屏
- wordpress - 我需要使用 PHP for 循环在 Dom PDF 上的 2 个不同页面上创建一个表格?
- gradle - 在 build.gradle.kts 中添加一个名为“main”的 Activity
- mysql - 从 galera 集群中删除数据库
- arrays - 更新函数中的字符串数组
- go - 在立即运行服务器之前释放端口
- python - 使用递归,计算列表中相同元素的数量并将其收集到字典中
- postgresql - 无法为 postgres_fdw 服务器设置 fdw_startup_cost
- python - cv2.fillPoly 相交多边形失败
- python - pymongo.errors.ServerSelectionTimeoutError 与 MongoDB atlas 和 Flask 错误