尝试在java中复制数组时出现ArrayStoreException

时间:2018-02-14 04:52:43

标签: java arrays exception copy

我在更改java中的2d数组的长度时遇到问题。 在为2d数组分配空间后,我无法将旧数组的值复制到新数组。但我可以在具有类似代码的1d数组上执行此操作。这是工作代码:

public static Object[] changeLength1D(Object [] a, int n, int new_length){

    if(n > new_length){
        throw new IllegalArgumentException("n must be greater or equal to new_length");
    }

    // Allocate space for 1d array
    Object[] new_array = (Object[]) Array.newInstance(a.getClass().getComponentType(), new_length);
    // Efficient array copy from a[0:n-1] to new_array
    System.arraycopy(a, 0, new_array, 0, n);

    return new_array;
}

但同样的逻辑在这里不起作用。当我使用arraycopy时,java会抛出这个:

Exception in thread "main" java.lang.ArrayStoreException
at java.base/java.lang.System.arraycopy(Native Method)

以下是2d数组的代码:

public static Object[][] changeLength2D(Object [][] a, int dim1_limit, int dim2_limit,int dim1_newLength, int dim2_newLength){

    if(dim1_limit > dim1_newLength || dim2_limit > dim2_newLength){
        throw new IllegalArgumentException("Limits must be <= new lengths");
    }

    // Allocate space for 2d array
    Object[][] new_array = (Object[][]) Array.newInstance(a.getClass().getComponentType(),
            dim1_newLength,dim2_newLength);


    // Copy by rows
    for(int x = 0; x < dim1_limit; x++){
       System.arraycopy(a[x], 0, new_array[x], 0 ,dim2_limit); // EXCEPTION THROWS RIGHT THIS LINE
    }

    return new_array;
}

1 个答案:

答案 0 :(得分:0)

原因

来自Array.newInstance()的{​​{3}}:

public static Object newInstance(Class<?> componentType,int... dimensions)
                      throws IllegalArgumentException,
                             NegativeArraySizeException
  

如果componentType表示数组类,则新数组的维数等于dimension.length的总和和componentType的维数

由于您通过以下方式创建了2d数组:

Object[][] new_array = (Object[][]) Array.newInstance(a.getClass().getComponentType(),
        dim1_newLength, dim2_newLength);

考虑到a是一个数组,new_array三维new_array[x]将有两个维度,这会在运行时导致ArrayStoreException doc因为类型不匹配。

解决方案

使用下面创建新的2d数组,并确保a[0][0]不为空

Object[][] new_array = (Object[][]) Array.newInstance(a[0][0].getClass(),
        dim1_newLength, dim2_newLength);