我读了一些写在“ ClassCastException”上的文章,但是我对此不太了解。有一篇好文章还是简短的解释?
我读了一些写在“ ClassCastException”上的文章,但是我对此不太了解。有一篇好文章还是简短的解释?
Answers:
直接来自API规范ClassCastException
:
抛出该异常以指示代码已尝试将对象强制转换为不是实例的子类。
因此,例如,当一个人尝试将an强制转换Integer
为a时String
,String
它不是的子类Integer
,因此ClassCastException
会抛出a。
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
如果您尝试向下转换一个类,则会发生此异常,但实际上该类不是该类型的。
考虑以下层次结构:
对象->动物->狗
您可能有一个称为的方法:
public void manipulate(Object o) {
Dog d = (Dog) o;
}
如果使用以下代码调用:
Animal a = new Animal();
manipulate(a);
它将编译得很好,但是在运行时您会得到一个a,ClassCastException
因为o实际上是动物而不是狗。
在更高版本的Java中,除非您执行以下操作,否则会收到编译器警告:
Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
考虑一个例子,
class Animal {
public void eat(String str) {
System.out.println("Eating for grass");
}
}
class Goat extends Animal {
public void eat(String str) {
System.out.println("blank");
}
}
class Another extends Goat{
public void eat(String str) {
System.out.println("another");
}
}
public class InheritanceSample {
public static void main(String[] args) {
Animal a = new Animal();
Another t5 = (Another) new Goat();
}
}
在Another t5 = (Another) new Goat()
:您将获得一个ClassCastException
因为您无法使用创建Another
类的实例Goat
。
注意:转换仅在类扩展父类并将子类强制转换为其父类的情况下有效。
如何处理ClassCastException
:
您了解铸造的概念吗?转换是类型转换的过程,这在Java中非常常见,因为它是静态类型的语言。一些例子:
将字符串“ 1”强制转换为整数->没问题
将字符串“ abc”转换为整数->引发ClassCastException
或考虑使用Animal.class,Dog.class和Cat.class的类图
Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.
Cat c = (Dog) a
不会引发ClassCastException
,而是编译器错误(类型不匹配)
我可以为您提供Java中的classcastException的一个很好的例子是在使用“集合”时
List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));
for(Object obj:list) {
String str = (String)obj;
}
上面的代码将在运行时为您提供ClassCastException。因为您尝试将Integer转换为String,所以将引发异常。
Java ClassCastException是当您尝试将类从一种类型不正确地转换为另一种类型时可能发生的异常。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ClassCastExceptionExample {
public ClassCastExceptionExample() {
List list = new ArrayList();
list.add("one");
list.add("two");
Iterator it = list.iterator();
while (it.hasNext()) {
// intentionally throw a ClassCastException by trying to cast a String to an
// Integer (technically this is casting an Object to an Integer, where the Object
// is really a reference to a String:
Integer i = (Integer)it.next();
}
}
public static void main(String[] args) {
new ClassCastExceptionExample();
}
}
如果尝试运行此Java程序,则会看到它将抛出以下ClassCastException:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main (ClassCastExceptionExample.java:19)
这里抛出异常的原因是,当我创建列表对象时,我存储在列表中的对象是字符串“ one”,但是后来当我尝试取出该对象时,我有意通过尝试犯错将其转换为整数。因为不能将String直接转换为Integer(Integer不是String的类型),所以将引发ClassCastException。
如果要对对象排序,但如果类未实现Comparable或Comparator,则将获得ClassCastException例如
class Animal{
int age;
String type;
public Animal(int age, String type){
this.age = age;
this.type = type;
}
}
public class MainCls{
public static void main(String[] args){
Animal[] arr = {new Animal(2, "Her"), new Animal(3,"Car")};
Arrays.sort(arr);
}
}
上面的main方法将抛出以下运行时类强制转换异常
线程“主”中的异常java.lang.ClassCastException:com.default.Animal无法转换为java.lang.Comparable
ClassCastException
将抛出a。所以,如果项目没有实现Comparable
然后Collections.sort()
将抛出此异常