Erläuterung von "ClassCastException" in Java

77

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?

Chathuranga Chandrasekara
quelle

Antworten:

117

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 Integerin ein zu verwandeln String, Stringist dies keine Unterklasse von Integer, also wird ein ClassCastExceptionWurf geworfen.

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.
Coobird
quelle
2
Bei jeder Art von Sortierung müssen alle Elemente miteinander vergleichbar sein (miteinander vergleichbar). Wenn nicht, wird ein ClassCastExceptionWurf geworfen. Also, wenn Gegenstände nicht implementiert Comparabledann Collections.sort()wird diese Ausnahme auslösen
overexchange
92

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 {...}
  1. Sie können eines dieser Dinge in Object umwandeln, da alle Java-Klassen von Object erben.
  2. Sie können entweder B oder C in A umwandeln, da beide "Arten" von A sind
  3. Sie können einen Verweis auf ein A-Objekt nur dann in B umwandeln, wenn das reale Objekt ein B ist.
  4. Sie können kein B in ein C umwandeln, obwohl beide A sind.
Charlie Martin
quelle
1
Bestes Beispiel in sof.
Adam Varhegyi
21

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, ClassCastExceptionweil 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
 }
Yishai
quelle
2
Nicht unbedingt niedergeschlagen - wenn Cat eine Unterschicht von Animal wäre und Sie versuchen würden, zu Dog zu wirken, würden Sie die gleiche Ausnahme bekommen
Barry
12

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, ClassCastExceptionweil Sie mit keine Instanz der AnotherKlasse 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:

  1. Seien Sie vorsichtig, wenn Sie versuchen, ein Objekt einer Klasse in eine andere Klasse umzuwandeln. Stellen Sie sicher, dass der neue Typ zu einer seiner übergeordneten Klassen gehört.
  2. Sie können die ClassCastException mithilfe von Generics verhindern, da Generics Kompilierungszeitprüfungen bereitstellen und zum Entwickeln typsicherer Anwendungen verwendet werden können.

Quelle der Notiz und der Rest

Elizabeth Courpalis
quelle
4

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).

Jeremy Huiskamp
quelle
4

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.
Mork0075
quelle
14
Ein bisschen pingelig, aber der String "1" kann nicht in ein int "umgewandelt" werden, sondern kann über die Integer.parseInt (String) -Methode in ein int konvertiert werden.
Coobird
2
Cast einen String "1" nach int -> kein Problem? das ist falsch
karlihnos
1
Auch Cat c = (Dog) awird nicht ein ClassCastException, sondern ein Compilerfehler ( Typ Mismatch )
auslösen
3

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.

Beispiel

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.

Shakun Tyagi
quelle
2

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.

Suganthan Madhavan Pillai
quelle
2

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.

Mistriel
quelle
0

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.

Ananta Chandra Das
quelle
0

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

karepu
quelle
0

Ausnahme ist keine Unterklasse von RuntimeException -> ClassCastException

    final Object  exception = new Exception();
    final Exception data = (RuntimeException)exception ;
    System.out.println(data);
Lalik
quelle