【问题标题】:java.lang.ClassCastException - Accessing Java array of Object arrays like 2 dimensional object arrayjava.lang.ClassCastException - 访问对象数组的 Java 数组,如二维对象数组
【发布时间】:2015-05-06 06:27:42
【问题描述】:

为了对使用 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

谁能帮帮我?

【问题讨论】:

  • 为什么不首先声明为Object[][]?
  • 您好,您的 outerArray 是一维的,因此您无法投射。
  • 异常说一维数组不能转换成二维数组
  • "使用 [][] 运算符" -- 这不是运算符!它只是代替一个括号,您将使用两个,例如int[][] 是一个二维整数数组。
  • sigh 又是一问一答。 @user:当你寻求帮助时,停留几分钟回答试图帮助你的人的问题。

标签: java arrays multidimensional-array classcastexception


【解决方案1】:

当声明一个一维数组,然后在每个单元格中添加数组时,您正在构建这个:

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

无法使用[][] 访问,因为它只有 1 行,每个单元格都有另一行对象,因此需要使用“awkward cast”访问它

如果你想要一个列结构:

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

应该用这个来创建:

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

【讨论】:

    【解决方案2】:

    当一个数组被创建时,它总是有一个类型。目的是保护您免受一类编程错误,当存储在数组中的项目稍后被读取并“使用”为另一种类型 (*) 时。你的数组类型是Object[].class,你不能仅仅因为数组里面的对象是Object[],就把它转换成Object[][].class。你也可以放Integer,系统不会抛出ArrayStoreException,因为Integer是Object的子类型。

    要么创建(并声明)数组为Object[][],要么使用“尴尬”演员表。

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

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

    【讨论】:

      【解决方案3】:
       Object[][] = (Object[][])outerArray;     // (2) Runtime error!!
      

      这里有一个语法错误。Object[][] 意味着您将声明一个多个 Object 数组。只需像这样更改:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 2020-11-19
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        相关资源
        最近更新 更多