Java大数组复制到小数组触发ArrayIndexOutOfBoundsException如何解决
问题根因分析
- 你对
System.arraycopy的参数理解存在错误,该方法的参数定义为:System.arraycopy(源数组, 源数组复制起始索引, 目标数组, 目标数组写入起始索引, 要复制的元素数量)
你直接把数组元素值in[i]当成了源索引,把未赋值的空数组元素值pushArray[i]当成目标索引,当原数组的遍历下标超过目标数组长度时,就会触发数组越界异常。 - 两层嵌套循环属于逻辑冗余,不需要循环遍历目标数组,单次遍历原数组搭配目标数组的写入指针即可完成需求,也不需要额外的中转数组。
正确实现代码
import java.util.Arrays; public class Main { public static int[] remove(int v, int[] in) { // 统计非目标值的元素数量,这部分原有逻辑正确 int size = 0; for (int i=0; i<in.length; i++) { if (in[i] != v) { size++; } } int[] pushArray = new int[size]; // 定义目标数组的写入位置指针 int writeIndex = 0; for (int i=0; i<in.length; i++) { if (in[i] != v) { pushArray[writeIndex] = in[i]; writeIndex++; } } return pushArray; } public static void main(String args[]) { System.out.println("Values from array: "); int[] intArray = new int[] {0, 1, 3, 2, 3, 0, 3, 1}; System.out.println(Arrays.toString(intArray)); int v = 3; System.out.println("Removing all values of " + v + " from array above ^"); int[] newArray = remove(v, intArray); System.out.println(Arrays.toString(newArray)); } }
运行输出
Values from array: [0, 1, 3, 2, 3, 0, 3, 1] Removing all values of 3 from array above ^ [0, 1, 2, 0, 1]
内容的提问来源于stack exchange,提问作者lieuja
相关产品推荐
相关产品推荐

