java.lang.ClassCastException - 访问Object数组的Java数组,如2维对象数组

时间:2015-05-06 06:27:42

标签: java arrays multidimensional-array classcastexception

为了解决使用JNI在C代码中创建的Object数组的故障,我创建了带有Object数组数组的纯Java代码,如下所示。 我想使用[] []运算符以二维对象数组(Object [] [])的方式访问此数组。但是,在将数组转换为Object [] []时,代码会崩溃,但会出现以下异常。

  

java.lang.ClassCastException:[Ljava.lang.Object;无法施展   [[Ljava.lang.Object

Object[] outerArray = new Object[3];
outerArray[0] = new Object[] {1,2,3,4,5};
outerArray[1] = new Object[] {10,20,30,40,50};
outerArray[2] = new Object[] {100,200,300,400,500};

Object o = ((Object[])outerArray[0])[0]; // (1) OK but awkward
Object[][] = (Object[][])outerArray;     // (2) Runtime error!!
o = outerArray[0][0];                    // (3) I want to do this

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

在声明具有一个维度的数组时,然后在每个单元格中添加数组时,您需要构建它:

[ [][][] ] [ [][][] ] [ [][][] ]

使用[][]无法访问,因为它只有1行,每个单元格都有另一行对象,因此需要使用"笨拙的强制转换"

如果您想要列结构:

[] [] []
[] [] []
[] [] []

它应该用这个创建:

Object[][] outerArray = new Object[3][5];

答案 1 :(得分:0)

创建数组时,它总是有一个类型。目的是保护您免受一类编程错误的影响,当存储在数组中的项目稍后被读取并且"使用"作为另一种类型(*)。您的数组类型为Object[].class,您无法将其转换为Object[][].class,因为数组中的对象为Object[]。您也可以添加Integer,并且系统不会抛出ArrayStoreException,因为IntegerObject的子类型。

您可以创建(并声明)数组为Object[][]或使用"尴尬"铸造。

(*)仍然会发生这种情况,直到运行时才知道

public class ArraysQuirks {
    public static void main(String... args) {
        String[] strings = {"a", "b", "c"};
        Object[] objects = strings;
        objects[0] = 1; // ArrayStoreException here
    }
}

答案 2 :(得分:0)

 Object[][] = (Object[][])outerArray;     // (2) Runtime error!!

这里是一个语法Error.Object [] []意味着你将声明一个Object的多个数组。改变如下:

Object[][] temp= (Object[][])outerArray; //it works