Explication de "ClassCastException" en Java


J'ai lu quelques articles écrits sur "ClassCastException", mais je n'ai pas pu avoir une bonne idée à ce sujet. Y a-t-il un bon article ou quelle serait une brève explication?

Author: Peter Mortensen, 2009-05-25

11 answers

Directement à partir des spécifications de l'API pour le ClassCastException:

Lancé pour indiquer que le code a tentative de lancer un objet sur un sous-classe dont il n'est pas un instance.

Ainsi, par exemple, lorsque l'on essaie de jeter un Integer pour un String, String n'est pas une sous-classe de Integer, donc a ClassCastException sera levée.

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.
 91
Author: coobird, 2009-05-25 16:46:47

C'est vraiment assez simple: si vous essayez de convertir un objet de classe A en un objet de classe B, et qu'ils ne sont pas compatibles, vous obtenez une exception de conversion de classe.

Pensons à une collection de classes.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Vous pouvez convertir n'importe laquelle de ces choses en Objet, car toutes les classes Java héritent d'Object.
  2. Vous pouvez convertir B ou C en A, car ce sont deux "sortes de" A
  3. Vous pouvez convertir une référence à un objet A en B uniquement si le réel l'objet est un B.
  4. Vous ne pouvez pas lancer un B à un C même s'ils sont tous les deux A.
 67
Author: Charlie Martin, 2009-05-25 17:29:37

C'est une exception qui se produit si vous essayez de réduire une classe, mais en fait la classe n'est pas de ce type.

Considérez cette héritage:

Objet - > Animal - > Chien

, Vous pourriez avoir une méthode appelée:

 public void manipulate(Object o) {
     Dog d = (Dog) o;
 }

Si appelé avec ce code:

 Animal a = new Animal();
 manipulate(a);

Il compilera très bien, mais à l'exécution, vous obtiendrez un ClassCastException car o était en fait un Animal, pas un chien.

Dans les versions ultérieures de Java, vous obtenez un avertissement de compilateur sauf si vous faire:

 Dog d;
 if(o instanceof Dog) {
     d = (Dog) o;
 } else {
     //what you need to do if not
 }
 16
Author: Yishai, 2015-01-06 00:32:10

Prenons un exemple,

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

At Another t5 = (Another) new Goat(): vous obtiendrez un ClassCastException car vous ne pouvez pas créer une instance de la classe Another en utilisant Goat.

Remarque: La conversion n'est valide que dans les cas où une classe étend une classe parente et que la classe enfant est convertie en sa classe parente.

Comment traiter le ClassCastException:

  1. Soyez prudent lorsque vous essayez de lancer un objet d'une classe dans une autre classe. Assurez-vous que le nouveau type appartient à l'un de ses parents classe.
  2. Vous pouvez empêcher l'exception ClassCastException en utilisant des génériques, car les génériques fournissent des vérifications du temps de compilation et peuvent être utilisés pour développer des applications sûres.

Source de la Note et le Reste

 8
Author: Elizabeth Courpalis, 2015-01-06 00:42:05

Comprenez-vous le concept de casting? Le casting est le processus de conversion de type, qui est très courant en Java car c'est un langage typé statiquement. Quelques exemples:

Cast la chaîne " 1 " à un int - > pas de problème

Cast la chaîne "abc" à un int - > déclenche une ClassCastException

Ou pensez à un diagramme de classe avec Animal.classe, Chien.la classe et le Chat.classe

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.
 4
Author: Mork0075, 2018-05-13 14:11:07

Vous essayez de traiter un objet comme une instance d'une classe qu'il n'est pas. C'est à peu près analogue à essayer d'appuyer sur la pédale d'amortisseur sur une guitare (les pianos ont des pédales d'amortisseur, les guitares non).

 3
Author: Jeremy Huiskamp, 2009-05-25 16:48:43

Une exception de conversion de classe est levée par Java lorsque vous essayez de convertir un objet d'un type de données en un autre.

Java nous permet de convertir des variables d'un type à un autre tant que la conversion se produit entre des types de données compatibles.

Par exemple, vous pouvez convertir une chaîne en Objet et, de même, un Objet contenant des valeurs de chaîne peut être converti en chaîne.

Exemple

Supposons que nous ayons un HashMap qui contient un certain nombre d'objets ArrayList.

Si nous écrivez du code comme ceci:

String obj = (String) hmp.get(key);

Il lancerait une exception de conversion de classe, car la valeur renvoyée par la méthode get de la carte de hachage serait une liste de tableaux, mais nous essayons de la convertir en une chaîne. Cela provoquerait l'exception.

 3
Author: shakun tyagi, 2016-11-16 22:48:09

Un très bon exemple que je peux vous donner pour classcastException en Java est en utilisant "Collection"

List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));

for(Object obj:list) {
    String str = (String)obj;
}

Ce code ci-dessus vous donnera ClassCastException lors de l'exécution. Parce que vous essayez de convertir un entier en chaîne, cela lèvera l'exception.

 2
Author: Suganthan Madhavan Pillai, 2013-11-16 17:33:49

Vous pouvez mieux comprendre ClassCastException et casting une fois que vous réalisez que la JVM ne peut pas deviner l'inconnu. Si B est une instance de A, il a plus de membres de classe et de méthodes sur le tas que A. La JVM ne peut pas deviner comment convertir A en B car la cible de mappage est plus grande et la JVM ne saura pas comment remplir les membres supplémentaires.

Mais si A était une instance de B, ce serait possible, car A est une référence à une instance complète de B, donc le mappage sera un-à-un.

 2
Author: Mistriel, 2016-11-16 22:49:33

Une ClassCastException Java est une exception qui peut se produire lorsque vous essayez de convertir incorrectement une classe d'un type à un autre.

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

Si vous essayez d'exécuter ce programme Java, vous verrez qu'il lancera l'exception ClassCastException suivante:

Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample  (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main  (ClassCastExceptionExample.java:19)

La raison pour laquelle une exception est levée ici est que lorsque je crée mon objet list, l'objet que je stocke dans la liste est la chaîne "one", mais plus tard, lorsque j'essaie de sortir cet objet, je fais intentionnellement une erreur en essayant de convertir un Entier. Parce qu'une Chaîne ne peut pas être directement convertie en un Entier, - un Entier n'est pas un type de Chaîne - une ClassCastException est levée.

 0
Author: Ananta Chandra Das, 2017-12-17 18:13:28

Si vous voulez trier les objets mais si la classe n'a pas implémenté Comparable ou Comparateur, vous obtiendrez ClassCastException Par exemple

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

Au-dessus de la méthode principale lancera en dessous de l'exception de cast de classe d'exécution

Exception dans le thread "main" java.lang.ClassCastException: com.défaut.Animal ne peut pas être converti en java.lang.Comparable

 0
Author: karepu, 2018-09-18 05:47:32