从一维数组列表转换为二维数组时出现 ArrayStoreException

ArrayStoreException When Converting from list of 1D arrays to 2D array

我在使用以下方法时遇到 java.lang.ArrayStoreException 错误:

public static int[][] getData(String path) throws IOException
    {
        // Read all
        CSVReader csvReader = new CSVReader(new FileReader(new File(path)));
        List<String []> list = csvReader.readAll();
        csvReader.close();

        // Convert to 2D array
        int[][] dataArr=list.toArray(new int[list.size()][]);

        for(int i = 0; i<3; i++)
        {
            for(int x = 0; x<3; x++)
            {


System.out.print(dataArr[i][x]);
        }
        System.out.println();
    }
    return dataArr;
}

它引用'//convert to 2D array'下的行作为问题,我已经尝试了我在其他问题中看到的各种方法来完成这项工作,但无济于事! 代码引用 path 中的 CSV 文件,然后用值填充二维数组。如果有任何人都知道的比使用 CSVReader 更简单的方法,我很乐意看到它!我在这里找到了这段代码,我也看过其他几篇关于它的帖子,但这似乎是最简单的,我不认为它会导致问题。

提前致谢。

您应该将字符串列表转换为字符串[][]:

// Convert to 2D array
String[][] dataArr=list.toArray(new String[0][0]);

注意 .toArray() 方法的文档:

Throws: ArrayStoreException - if the runtime type of the specified array is not a supertype of the runtime type of every element in this list

在您的例子中,指定的数组是 int[] 类型,并且不是列表中每个元素类型的超类型,即 String[].

修复可能取决于您需要什么类型的数组。如果您需要字符串中的 int[][],则需要迭代并构建 int[][]。如果 String[][] 就足够了,那么您可以为 .toArray() 方法提供一个新的 String[][]

用线:

int[][] dataArr=list.toArray(new int[list.size()][]);

您正在尝试将 String[] 存储在 int[][] 中,这是不允许的。由于数组会在运行时检查其组件的类型,因此会出现异常。


如果您想将 List<String[]> 转换为 int[][],则必须手动进行:

int[][] dataArr = new int[list.size()][];

for(int i = 0; i < list.size(); i++) {
    dataArr[i] = new int[list.get(i).length];
    for(int j = 0; j < dataArr[i].length; j++) {
        dataArr[i][j] = Integer.parseInt(list.get(i)[j]);
    }
}