如何在增强的 for 循环中修复 ClassCastException?
How to fix ClassCastException in enhanced for-loop?
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
。如何解决这个问题?
的 java 文档
Thrown to indicate that the code has attempted to cast an object to a
subclass of which it is not an instance
看到这个例子,
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
仅 存在问题的方式给定发布的代码,如果报告的exception/line 是正确的,是什么时候"Somerecords" 并不是 真正地 创建一个 List<Object[]>
对象 - 而是一个包含 的 List
非-Object[]元素。
一个原因可能是所讨论的方法被键入为 return 一个 非泛型 List
,填充了双精度值。 Java 将输入此 并带有警告 - 例如。 "uses unchecked or unsafe operations".
也就是说,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);
解决方案:到处使用泛型,不要忽略或抑制编译器警告。
建议:在以后的帖子中包含 完整 异常消息,因为它将显示所涉及的类型 - 并且可能导致更少的 close/down 投票。
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
。如何解决这个问题?
Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance
看到这个例子,
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
仅 存在问题的方式给定发布的代码,如果报告的exception/line 是正确的,是什么时候"Somerecords" 并不是 真正地 创建一个 List<Object[]>
对象 - 而是一个包含 的 List
非-Object[]元素。
一个原因可能是所讨论的方法被键入为 return 一个 非泛型 List
,填充了双精度值。 Java 将输入此 并带有警告 - 例如。 "uses unchecked or unsafe operations".
也就是说,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);
解决方案:到处使用泛型,不要忽略或抑制编译器警告。
建议:在以后的帖子中包含 完整 异常消息,因为它将显示所涉及的类型 - 并且可能导致更少的 close/down 投票。