【问题标题】:How to fix ClassCastException in enhanced for-loop? [closed]如何在增强的 for 循环中修复 ClassCastException? [关闭]
【发布时间】:2015-04-05 10:44:00
【问题描述】:
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。如何解决这个问题?

【问题讨论】:

  • listOfObjectArray 是什么数据类型?所以更多的代码会有所帮助
  • 这个 listOfObjectArray 是数组列表吗?
  • 也许改用for(Object obj : listOfObjectArray) {...}
  • 请贴出listOfObjectArray的初始化代码
  • 使用 listOfObjectArray 初始化编辑问题。

标签: java arraylist foreach classcastexception


【解决方案1】:

唯一问题可能存在的方式给定发布的代码,如果报告的异常/行是正确的,则“Somerecords”不是真的创建了一个List&lt;Object[]&gt; 对象 - 但List 包含-Object[] 元素。

一个原因可能是所讨论的方法被键入以返回一个 非泛型 List,其中填充了双精度值。 Java 将类型接受此并发出警告 - 例如。 “使用未经检查或不安全的操作”。

也就是说,C&lt;T&gt; generic = (C)generic_or_plain 是编译时类型有效的 - 即使生成的代码是运行时类型无效的。同样,C plain = (C&lt;T&gt;)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);

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

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

【讨论】:

  • 您能否详细说明解决方案。很抱歉没有提供适当的详细信息。你有我的问题。
  • 转到生成“somerecords”的代码并确保它返回包含 Object[] 元素的有效 List 对象。如果没有显示获取“somerecords”的方法(或代码),就不可能说出它生成错误的原因。如果泛型类型信息在整个程序中传播,那么正确性将由类型系统本身来保证。
【解决方案2】:

来自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

【讨论】:

  • List listOfObjectArray = new ArrayList();是声明。列表中的每个元素都是一个数组。我的语法是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多