You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:57:06