java - "Argument is not an array"使用Java反射设置数组值时出现异常

标签 java arrays reflection

我需要在运行时根据输入数组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 或更大,则代码可以正常工作。要从创建部分中进行反射(reflection):

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
    }
}

关于java - "Argument is not an array"使用Java反射设置数组值时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17643672/

相关文章:

java - 当没有 Activity 时,是否可以选择在测试早期失败?

java - 计算字符串数组中字符的出现次数

javascript - 使用 Object.assign() 组合两个对象数组?

我们可以将更长的字符串分配给数组吗?

c# - 如何在被调用的方法中获取事件名称

c# - 设置装配引用路径

java - 使 ArrayList 只读

java - 串纹打印

c++ - 在屏幕上显示 vector

objective-c - 有没有办法将整个参数列表传递给 Objective C 中的另一个方法?