我在更改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;
}
答案 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);