Ich habe einige Artikel über "ClassCastException" gelesen, konnte mir aber keine gute Vorstellung davon machen. Gibt es einen guten Artikel oder was wäre eine kurze Erklärung?
Ich habe einige Artikel über "ClassCastException" gelesen, konnte mir aber keine gute Vorstellung davon machen. Gibt es einen guten Artikel oder was wäre eine kurze Erklärung?
Antworten:
Direkt aus den API-Spezifikationen für ClassCastException
:
Wird ausgelöst, um anzuzeigen, dass der Code versucht hat, ein Objekt in eine Unterklasse umzuwandeln, von der es keine Instanz ist.
Wenn man zum Beispiel versucht, ein Integer
in ein zu verwandeln String
, String
ist dies keine Unterklasse von Integer
, also wird ein ClassCastException
Wurf geworfen.
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
Es ist wirklich ziemlich einfach: Wenn Sie versuchen, ein Objekt der Klasse A in ein Objekt der Klasse B zu typisieren, und diese nicht kompatibel sind, erhalten Sie eine Klassenumwandlungsausnahme.
Denken wir an eine Sammlung von Klassen.
class A {...}
class B extends A {...}
class C extends A {...}
Es ist eine Ausnahme, die auftritt, wenn Sie versuchen, eine Klasse herunterzuspielen, aber tatsächlich ist die Klasse nicht von diesem Typ.
Betrachten Sie diese Erbe:
Objekt -> Tier -> Hund
Möglicherweise haben Sie eine Methode namens:
public void manipulate(Object o) {
Dog d = (Dog) o;
}
Wenn mit diesem Code aufgerufen:
Animal a = new Animal();
manipulate(a);
Es wird gut kompiliert, aber zur Laufzeit erhalten Sie eine, ClassCastException
weil o tatsächlich ein Tier war, kein Hund.
In späteren Versionen von Java erhalten Sie eine Compiler-Warnung, sofern Sie nicht Folgendes tun:
Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
Betrachten Sie ein Beispiel,
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();
}
}
Um Another t5 = (Another) new Goat()
: Sie erhalten eine, ClassCastException
weil Sie mit keine Instanz der Another
Klasse erstellen können Goat
.
Hinweis : Die Konvertierung ist nur in Fällen gültig, in denen eine Klasse eine übergeordnete Klasse erweitert und die untergeordnete Klasse in ihre übergeordnete Klasse umgewandelt wird.
Umgang mit ClassCastException
:
Sie versuchen, ein Objekt als eine Instanz einer Klasse zu behandeln, die es nicht ist. Es ist ungefähr analog zu dem Versuch, das Dämpferpedal auf einer Gitarre zu drücken (Klaviere haben Dämpferpedale, Gitarren nicht).
Verstehst du das Konzept des Castings? Casting ist der Prozess der Typkonvertierung, der in Java sehr verbreitet ist, da es sich um eine statisch typisierte Sprache handelt. Einige Beispiele:
Wirf den String "1" in ein int -> kein Problem
Wandle den String "abc" in ein int -> löst eine ClassCastException aus
Oder denken Sie an ein Klassendiagramm mit Animal.class, Dog.class und 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
wird nicht ein ClassCastException
, sondern ein Compilerfehler ( Typ Mismatch )
Eine Klassenumwandlungsausnahme wird von Java ausgelöst, wenn Sie versuchen, ein Objekt eines Datentyps in einen anderen umzuwandeln.
Mit Java können wir Variablen eines Typs in einen anderen umwandeln, solange das Umwandeln zwischen kompatiblen Datentypen erfolgt.
Beispielsweise können Sie einen String als Objekt umwandeln, und auf ähnliche Weise kann ein Objekt, das String-Werte enthält, in einen String umgewandelt werden.
Nehmen wir an, wir haben eine HashMap, die eine Reihe von ArrayList-Objekten enthält.
Wenn wir Code wie folgt schreiben:
String obj = (String) hmp.get(key);
Es würde eine Klassenumwandlungsausnahme auslösen, da der von der get-Methode der Hash-Map zurückgegebene Wert eine Array-Liste wäre, aber wir versuchen, sie in einen String umzuwandeln. Dies würde die Ausnahme verursachen.
Ein sehr gutes Beispiel, das ich Ihnen für classcastException in Java geben kann, ist die Verwendung von "Collection".
List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));
for(Object obj:list) {
String str = (String)obj;
}
Dieser obige Code gibt Ihnen zur Laufzeit eine ClassCastException. Da Sie versuchen, Integer in String umzuwandeln, wird die Ausnahme ausgelöst.
Sie können ClassCastException und Casting besser verstehen, wenn Sie feststellen, dass die JVM das Unbekannte nicht erraten kann. Wenn B eine Instanz von A ist, hat es mehr Klassenmitglieder und Methoden auf dem Heap als A. Die JVM kann nicht erraten, wie A in B umgewandelt werden soll, da das Zuordnungsziel größer ist, und die JVM weiß nicht, wie die zusätzlichen Mitglieder gefüllt werden sollen.
Wenn A jedoch eine Instanz von B wäre, wäre dies möglich, da A eine Referenz auf eine vollständige Instanz von B ist, sodass die Zuordnung eins zu eins erfolgt.
Eine Java ClassCastException ist eine Ausnahme, die auftreten kann, wenn Sie versuchen, eine Klasse nicht ordnungsgemäß von einem Typ in einen anderen zu konvertieren.
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();
}
}
Wenn Sie versuchen, dieses Java-Programm auszuführen, wird die folgende ClassCastException ausgelöst:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main (ClassCastExceptionExample.java:19)
Der Grund, warum hier eine Ausnahme ausgelöst wird, ist, dass beim Erstellen meines Listenobjekts das Objekt, das ich in der Liste speichere, die Zeichenfolge "Eins" ist. Wenn ich später versuche, dieses Objekt herauszuholen, mache ich absichtlich einen Fehler, indem ich es versuche um es in eine ganze Zahl umzuwandeln. Da ein String nicht direkt in eine Ganzzahl umgewandelt werden kann - eine Ganzzahl ist kein String-Typ - wird eine ClassCastException ausgelöst.
Wenn Sie Objekte sortieren möchten, die Klasse jedoch Comparable oder Comparator nicht implementiert hat, erhalten Sie beispielsweise 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);
}
}
Die obige Hauptmethode löst die Cast-Ausnahme der Laufzeitklasse aus
Ausnahme im Thread "main" java.lang.ClassCastException: com.default.Animal kann nicht in java.lang.Comparable umgewandelt werden
ClassCastException
Wurf geworfen. Also, wenn Gegenstände nicht implementiertComparable
dannCollections.sort()
wird diese Ausnahme auslösen