Explication de «ClassCastException» en Java

J’ai lu des articles écrits sur “ClassCastException”, mais je ne pouvais pas en avoir une bonne idée. Y a-t-il un bon article ou quelle serait une brève explication?

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

    Émis pour indiquer que le code a tenté de convertir un object en sous-classe dont il ne s’agit pas d’une instance.

    Ainsi, par exemple, lorsque vous ClassCastException un Integer en une Ssortingng , Ssortingng n’est pas une sous-classe de Integer , donc une ClassCastException sera lancée.

     Object i = Integer.valueOf(42); Ssortingng s = (Ssortingng)i; // ClassCastException thrown here. 

    C’est vraiment très simple: si vous essayez de classer un object de classe A dans un object de classe B, et qu’elles 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 ces objects en Object, car toutes les classes Java héritent d’Object.
    2. Vous pouvez lancer B ou C en A, car ils sont tous les deux des “types de” A
    3. Vous ne pouvez référencer une référence à un object A que si l’object réel est un object B.
    4. Vous ne pouvez pas lancer un B à un C même si ce sont les deux A.

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

    Considérez cette hiérarchie:

    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 comstackra très bien, mais à l’exécution, vous obtiendrez une ClassCastException car o était en fait un Animal, pas un Chien.

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

      Dog d; if(o instanceof Dog) { d = (Dog) o; } else { //what you need to do if not } 

    Prenons un exemple.

     class Animal { public void eat(Ssortingng str) { System.out.println("Eating for grass"); } } class Goat extends Animal { public void eat(Ssortingng str) { System.out.println("blank"); } } class Another extends Goat{ public void eat(Ssortingng str) { System.out.println("another"); } } public class InheritanceSample { public static void main(Ssortingng[] args) { Animal a = new Animal(); Another t5 = (Another) new Goat(); } } 

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

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

    Comment gérer l’ ClassCastException :

    1. Soyez prudent lorsque vous essayez de lancer un object d’une classe dans une autre classe. Assurez-vous que le nouveau type appartient à l’une de ses classes parentes.
    2. Vous pouvez empêcher l’exception ClassCastException à l’aide de Generics, car les génériques fournissent des contrôles de compilation et peuvent être utilisés pour développer des applications sécurisées.

    Source de la note et du repos

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

    Lancer la chaîne “1” dans un int -> pas de problème

    Lancer la chaîne “abc” dans un int -> déclenche une exception ClassCastException

    Ou penser à un diagramme de classes avec Animal.class, Dog.class et 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. 

    Vous essayez de traiter un object comme une instance d’une classe qui ne l’est pas. C’est grosso modo analogue à essayer d’appuyer sur la pédale forte d’une guitare (les pianos ont des pédales plus humides, les guitares non).

    Une exception de conversion de classe est lancée par Java lorsque vous essayez de transtyper un object d’un type de données en un autre.

    Java nous permet de convertir des variables d’un type à un autre tant que le casting se produit entre des types de données compatibles.

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

    Exemple

    Supposons que nous avons un HashMap contenant un certain nombre d’objects ArrayList.

    Si nous écrivons du code comme ceci:

     Ssortingng obj = (Ssortingng) 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.

    Un très bon exemple que je peux vous donner pour classcastException en Java est d’utiliser “Collection”

     List list = new ArrayList(); list.add("Java"); list.add(new Integer(5)); for(Object obj:list) { Ssortingng str = (Ssortingng)obj; } 

    Ce code ci-dessus vous donnera une exception ClassCastException à l’exécution. Parce que vous essayez de convertir Integer en Ssortingng, cela lancera l’exception.

    Vous pouvez mieux comprendre ClassCastException et lancer une fois que vous réalisez que la JVM ne peut pas deviner l’inconnu. Si B est une instance de A, le tas contient plus de membres et de méthodes que A. La JVM ne peut pas déterminer 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, il serait possible, car A est une référence à une instance complète de B, le mappage sera donc un-à-un.

    Une exception Java ClassCastException est une exception pouvant survenir lorsque vous essayez de convertir de manière incorrecte 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 Ssortingng to an // Integer (technically this is casting an Object to an Integer, where the Object // is really a reference to a Ssortingng: Integer i = (Integer)it.next(); } } public static void main(Ssortingng[] args) { new ClassCastExceptionExample(); } } 

    Si vous essayez d’exécuter ce programme Java, vous verrez qu’il va lancer l’exception ClassCastException suivante:

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

    La raison pour laquelle une exception est lancée ici est que lorsque je crée mon object de liste, l’object que je stocke dans la liste est la chaîne «one», mais plus tard lorsque j’essaie de faire sortir cet object, je fais intentionnellement une erreur pour le convertir en un entier. Comme une chaîne ne peut pas être directement convertie en un entier – un entier n’est pas un type de chaîne – une exception ClassCastException est levée.