Java中“ClassCastException”的解释
-
05-09-2019 - |
题
我读了一些关于“ClassCastException”的文章,但我对此没有什么好主意。有没有好的文章或者简单的解释?
解决方案
直从用于 ClassCastException
:
抛出,表明该码具有 试图将对象强制转换到 子类,其中它不是一个 实例
因此,例如,当一个人试图铸造一个Integer
到String
,String
不是Integer
的子类,因此ClassCastException
将被抛出。
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
其他提示
这真的很简单:如果您尝试将 A 类的对象类型转换为 B 类的对象,并且它们不兼容,则会出现类转换异常。
让我们考虑一下类的集合。
class A {...}
class B extends A {...}
class C extends A {...}
- 您可以将这些内容中的任何一个强制转换为 Object,因为所有 Java 类都继承自 Object。
- 您可以将 B 或 C 转换为 A,因为它们都是 A 的“种类”
- 您可以将对 A 对象的引用强制转换为 B 除非 真实物体是B。
- 你不能将 B 投射到 C,即使它们都是 A。
有如果试图向下转换一类发生了异常,但实际上类是该类型的不
考虑此层次结构:
对象 - >动物 - >狗
您可能已经调用的方法:
public void manipulate(Object o) {
Dog d = (Dog) o;
}
如果调用代码:
Animal a = new Animal();
manipulate(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
:
- 尝试将一个类的对象转换为另一个类时要小心。确保新类型属于其父类之一。
- 您可以使用泛型来防止 ClassCastException,因为泛型提供编译时检查并可用于开发类型安全的应用程序。
您正试图把一个对象作为一类,它不是一个实例。这大致类似于试图按下吉他(钢琴有阻尼器踏板,吉他不用)。
延音踏板你明白铸造的概念?铸造是类型转换,这是在Java中很常见的,因为它是静态类型语言的过程。一些例子:
铸造字符串 “1” 为int - >没有问题
铸字符串 “ABC” 为int - >提出了一个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.
一个类转换异常是由爪哇在尝试施放一个数据类型的一个对象到另一抛出。
Java允许我们只要铸造兼容的数据类型之间发生投一个类型的变量到另一个。
例如可以投下字符串为包含字符串值可以转换为一个字符串对象和类似对象。
实施例
让我们假设我们有一个持有数量的ArrayList对象的HashMap中。
如果我们写出这样的代码:
String obj = (String) hmp.get(key);
它会抛出一个类转换异常,因为散列映射的get方法返回的值将是一个数组列表,但我们正试图将它转换为字符串。这将导致异常。
时,同时使用,我可以给你ClassCastException异常在Java中一个很好的例子“收集”
List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));
for(Object obj:list) {
String str = (String)obj;
}
这上面的代码会给你ClassCastException异常运行时。因为你想投整数转字符串,将抛出该异常。
您可以更好地了解ClassCastException异常和铸造一旦你认识到JVM无法猜测未知。如果B是它在堆上比A的JVM无法猜测如何强制转换为B时,由于映射目标较大,JVM将不知道如何填补其他成员更多的类成员和方法的一个实例。
但是,如果A是B的一个实例,这将是可能的,因为A是B的一个完整的实例的引用,这样的映射将是一个对一个。
一个爪哇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)
异常被抛出这里的原因是,当我创建我的列表对象,我存储在列表中的对象是字符串“一个”,但后来,当我试图让这个对象了我故意做出尝试将其转换为一个整数的错误。因为字符串不能被直接转换为一个整数 - 一个整数,不是String类型的 - 则抛出ClassCastException
如果要排序的对象,但如果类没有实现相当或比较,那么你会得到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);
}
}
上述主要方法将抛出下面运行时类转换异常
异常在线程 “主要” java.lang.ClassCastException:com.default.Animal不能转换到java.lang.Comparable的