如何在增强的for循环中修复ClassCastException?

时间:2015-02-05 14:19:06

标签: java arraylist foreach classcastexception

List<Object[]> listOfObjectArray = new ArrayList<Object[]>(); 
// List of object arrays, where each element is an array.

....

listOfObjectArray = ##Somerecords; (Eg : [12.0,13.0,14.0,15.0....])

...

for(Object[] obj : listOfObjectArray) {...}

如果列表中的数组长度为1,那么我得到ClassCastException。如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

来自ClassCastException

的java文档
  

抛出以指示代码已尝试将对象强制转换为   它不是实例的子类

见这个例子,

String[] names = {"Ethan Hawke", "Julie Delpy"}; // Array of String objects
for(Object name : names){ 
   System.out.print("Name: " + (int)name); // casting String object to int
}

抛出,

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot 
be cast to java.lang.Integer

<强>更新

您没有正确地投射Object[]数据,

看到这个,

List<Object[]> listOfObjectArray = new ArrayList<Object[]>();

Object[] intArrary = { 1, 2, 3, 4 }; // declare an int array
Object[] intArrary2 = { 4, 5, 6, 7 }; // declare an int array
Object[] intArrary3 = { 5.0, 5.3, 2.0, 1.8 }; // declare a double array

listOfObjectArray.add(intArrary); // add it in Object array
listOfObjectArray.add(intArrary2); // add it in Object array
listOfObjectArray.add(intArrary3); // add it in Object array

for (Object[] outerArray : listOfObjectArray) {
    for (Object innerArray : outerArray) { // for each array "s" in array "p"

        // check if array type is Integer.
        if (innerArray instanceof Integer)
            System.out.println((int) innerArray); // cast your array to int

        // check if array type is Double.               
        if (innerArray instanceof Double)
            System.out.println((double) innerArray); // cast your array to double
    }
}

<强>输出

1
2
3
4
4
5
6
7
5.0
5.3
2.0
1.8

答案 1 :(得分:1)

方式问题可以存在给定已发布的代码,如果报告的异常/行正确,则“Somerecords”不是真的创建List<Object[]>对象 - 但是List包含 -Object []元素。

有一个原因可能是输入有问题的方法来返回填充了双精度值的非泛型 List。 Java将使用警告键入 - 接受此 - 例如。 “使用未经检查或不安全的操作”。

即使结果代码是运行时类型无效C<T> generic = (C)generic_or_plain是编译时类型有效 - 。同样,C plain = (C<T>)compatible_generic_or_plain是有效的代码,但可能导致误导plain

考虑:

List<Object[]> r = new ArrayList<Object[]>();
List r2 = r; // Because generics are "imaginary" we can fake this,
             // but the compiler WILL GENERATE A WARNING at type information loss
r2.add(1.2); // Now we add a Double (to r since r2 is r)

// CC! - Have a Double where Object[] was expected
Object[] res = (Object[])r.get(0);

另一种方式可能会导致同样的问题,但是来自不同的方面:

// Type-valid, but "unsafe" (and invalid)
List<Object[]> r = (List)Arrays.asList("Hello");

// CCE! - Have String, expected Object[]
Object[] res = (Object[])r.get(0);

解决方案:在任何地方使用泛型,不要忽略或禁止编译器警告。

建议:在将来的帖子中包含完整的异常消息,因为它会显示所涉及的类型 - 并且可能导致较少的关闭/减少投票。