wake-up-neo.net

Erklärung zu "ClassCastException" in Java

Ich habe einige Artikel gelesen, die über "ClassCastException" geschrieben wurden. Gibt es einen guten Artikel oder was wäre eine kurze Erklärung?

Direkt aus den API-Spezifikationen für die ClassCastException :

Wird ausgelöst, um anzuzeigen, dass der Code .__ hat. hat versucht, ein Objekt in eine .__ umzuwandeln. Unterklasse, von der es kein .__ ist. Beispiel.

Wenn zum Beispiel versucht wird, eine Integer in eine String umzuwandeln, ist String keine Unterklasse von Integer, daher wird eine ClassCastException geworfen.

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.
99
coobird

Es ist wirklich ziemlich einfach: Wenn Sie versuchen, ein Objekt der Klasse A in ein Objekt der Klasse B zu tippen, und sie 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 jedes dieser Elemente 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 auf B setzen, wenn das reale Objekt ein B ist.
  4. Sie können ein B nicht in ein C werfen, auch wenn beide A's sind.
74
Charlie Martin

Es ist eine Ausnahme, die auftritt, wenn Sie versuchen, eine Klasse herunterzuschalten, aber tatsächlich ist die Klasse nicht von diesem Typ.

Betrachten Sie diese Hierarchie:

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
 }
18
Yishai

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();
    }
}

Bei Another t5 = (Another) new Goat(): erhalten Sie eine ClassCastException, da Sie mit Another keine Instanz der Goat-Klasse erstellen können. 

Note: Die Konvertierung ist nur in den Fällen gültig, in denen eine Klasse eine übergeordnete Klasse erweitert und die untergeordnete Klasse in ihre übergeordnete Klasse umgewandelt wird.

Umgang mit der 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 Überprüfungen der Kompilierungszeit bieten und zum Entwickeln typsicherer Anwendungen verwendet werden können.

Quelle der Notiz und der Rest

9

Verstehst du das Gusskonzept? Casting ist der Prozess der Typumwandlung, der in Java sehr häufig ist, da er eine statisch typisierte Sprache ist. Einige Beispiele:

Umwandeln Sie den String "1" in ein int -> kein Problem

Den String "abc" in ein int umwandeln -> 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.
5
Mork0075

Sie versuchen, ein Objekt als eine Instanz einer Klasse zu behandeln, die es nicht ist. Es ist ungefähr vergleichbar mit dem Versuch, das Dämpferpedal auf einer Gitarre zu drücken (Klaviere haben Dämpferpedale, Gitarren nicht).

4
Jeremy Huiskamp

Eine Klassenumwandlungsausnahme wird von Java ausgelöst, wenn Sie versuchen, ein Objekt eines Datentyps in einen anderen umzuwandeln.

Java ermöglicht es uns, Variablen eines Typs in einen anderen umzuwandeln, solange die Umwandlung zwischen kompatiblen Datentypen erfolgt.

Beispielsweise können Sie einen String als Objekt umwandeln, und in ähnlicher 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. Wir versuchen jedoch, dies in einen String umzuwandeln. Dies würde die Ausnahme verursachen.

3
shakun tyagi

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 Code gibt Ihnen zur Laufzeit 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, befinden sich mehr Klassenmitglieder und Methoden auf dem Heapspeicher als A. Die JVM kann nicht erraten, wie A nach B umgewandelt werden soll, da das Zuordnungsziel größer ist und die JVM nicht wissen kann, 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. Daher wird die Zuordnung eins zu eins sein.

2
Mistriel

Wenn Sie Objekte sortieren möchten, die Klasse Comparable oder Comparator jedoch nicht implementiert hat, wird ClassCastException .__ angezeigt. Beispiel:

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);
   }
}

Über der Hauptmethode wird eine Ausnahme für die Ausführung der Laufzeitklasse ausgelöst

Ausnahme im Thread "main" Java.lang.ClassCastException: com.default.Animal kann nicht in Java.lang.Comparable umgewandelt werden

0
karepu

Eine Java ClassCastException ist eine Ausnahme, die auftreten kann, wenn Sie versuchen, eine Klasse falsch 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, werden Sie feststellen, dass die folgende ClassCastException ausgelöst wird:

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, der String „Eins“ ist. Wenn ich jedoch versuche, dieses Objekt herauszuholen, mache ich absichtlich einen Fehler, indem ich es versuche um es in eine Ganzzahl zu gießen. Da eine Zeichenfolge nicht direkt in eine Ganzzahl umgewandelt werden kann - eine Ganzzahl ist keine Art von Zeichenfolge -, wird eine ClassCastException ausgelöst.

0