我需要在运行时根据输入数组tableParameter的值创建一个数组。
我的代码示例如下:
int[] tableParameter = new int[dimension + 1];
tableParameter[0] = N;
for(int i = 1; i < tableParameter.length; i++)
tableParameter[i] = i;
Object myArray = Array.newInstance(int.class, tableParameter);
//set the index 1 of the array with the value 100
Array.setInt(myArray, 1, 100);
异常发生在上面代码的最后一行:
Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array
但当我使用时
System.out.println(myArray.getClass().getCanonicalName());
为了验证myArray的类,它打印出int[][][][],这意味着myArray肯定是一个数组类型。
那么,JVM为什么抛出myArray不是数组的异常呢?
这可能是一个误导性的例外,但抱怨肯定是正确的。如果数组是int[][][][]
,那么将索引1处的元素设置为值100是没有意义的。例如,这不会编译:
int[][][][] array = new int[1][1][1][1];
array[0] = 100; // Nope...
只有当元素是实际的int[]
时,才能将其设置为int
。因此,如果dimension
为0(意味着您最终得到的是一个一维数组),并且N
为2或更大,则代码运行良好。要消除创建部分的反射:
import java.lang.reflect.Array;
class Test {
public static void main(String[] args) throws Exception {
int[] array1 = new int[10];
Array.setInt(array1, 1, 100); // Works fine
int[][] array2 = new int[10][10];
Array.setInt(array2, 1, 100); // Throws IllegalArgumentException
}
}