Question

Je lis quelques articles écrits sur « ClassCastException », mais je ne pouvais pas avoir une bonne idée à ce sujet. Y at-il un bon article ou ce serait une brève explication?

Était-ce utile?

La solution

Droit de l'API Spécifications pour le ClassCastException :

  

Jeté pour indiquer que le code a   tentative pour lancer un objet à un   la sous-classe dont il est pas   par exemple.

Ainsi, par exemple, quand on essaie de jeter un coup Integer à un String, String n'est pas une sous-classe de Integer, donc une ClassCastException sera levée.

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

Autres conseils

Il est vraiment assez simple: si vous essayez de typer un objet de classe A dans un objet de classe B, et ils ne sont pas compatibles, vous obtenez une exception class cast

.

Réfléchissons d'une collection de classes.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Vous pouvez jeter l'une de ces choses à un objet, parce que toutes les classes Java héritent de l'objet.
  2. Vous pouvez lancer B ou C à A, parce qu'ils sont tous les deux « types de » A
  3. Vous pouvez jeter une référence à un objet A à B que si l'objet réel est un B.
  4. Vous ne pouvez pas jeter un B à un C, même si elles sont
  5. des deux A.

Il est une exception qui se produit si vous essayez de downcaster une classe, mais en fait la classe ne sont pas de ce type.

Considérez ceci heirarchy:

  

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 lors de l'exécution, vous obtiendrez un ClassCastException parce que 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 faites:

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

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

Remarque :. La conversion est valable uniquement dans les cas où une classe étend une classe mère et la classe de l'enfant est à sa classe casted mère

Comment faire face à la ClassCastException:

  1. Faites attention lorsque vous essayez de jeter un objet d'une classe dans une autre classe. Assurez-vous que le nouveau type appartient à l'une de ses classes parent.
  2. Vous pouvez empêcher l'ClassCastException en utilisant Generics, car Generics permettent de compiler des contrôles de temps et peuvent être utilisés pour développer des applications de type sécurisé.

Source de la note et le reste

Vous essayez de traiter un objet comme une instance d'une classe qui ne l'est pas. Il est à peu près analogue à essayer d'appuyer sur la pédale d'une guitare (les pianos pédales amortisseur, guitares ne le font pas).

Comprenez-vous le concept de casting? Le casting est le processus de conversion de type, ce qui est en Java très commun parce que son langage typé statiquement. Voici quelques exemples:

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

Couler la chaîne "abc" à un int -> soulève un 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.

Une exception class cast est lancée par Java lorsque vous essayez de jeter un objet d'un type de données à un autre.

Java nous permet de lancer des variables d'un type à l'autre tant que la coulée se produit entre les types de données compatibles.

Par exemple, vous pouvez lancer une chaîne comme un objet et de même un objet qui contient des valeurs de chaîne peut être jeté à une chaîne.

Exemple

Supposons que nous avons un HashMap qui détient un certain nombre d'objets ArrayList.

Si nous écrire du code comme ceci:

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

il jetterait une exception fonte de classe, parce que la valeur retournée par la méthode get de la carte de hachage serait une liste Array, mais nous essayons de le jeter à une chaîne. Cela provoquerait l'exception.

Un très bon exemple que je peux vous donner pour ClassCastException en Java est tout 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 sur l'exécution. Parce que vous essayez de lancer entier en chaîne, qui va lancer l'exception.

Vous pouvez mieux comprendre ClassCastException et casting une fois que vous réalisez que la machine virtuelle Java ne peut pas deviner l'inconnu. Si B est une instance de A, il a plus de membres de la classe et des méthodes sur le tas que A. La machine virtuelle Java ne peut pas deviner comment lancer A à B puisque la cible de la cartographie est plus grande, et la machine virtuelle Java ne saura pas comment remplir les autres membres.

Mais si A est une instance de B, il serait possible, parce que A est une référence à une instance complète de B, de sorte que la cartographie sera un à un.

A Java ClassCastException est une exception qui peut se produire lorsque vous essayez de convertir de manière incorrecte une classe d'un type à l'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 va jeter le ClassCastException suivant:

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 est que lorsque je crée mon objet de la liste, l'objet que je stocke dans la liste est la chaîne « un » mais plus tard, quand je tente d'obtenir cet objet sur je fais intentionnellement une erreur en essayant de le jeter à un nombre entier. Parce qu'une chaîne ne peut pas être jeté directement à un nombre entier - un entier n'est pas un type de chaîne -. Un ClassCastException est jeté

Si vous voulez trier des objets, mais si la classe n'a pas mis en œuvre ou Comparable Comparator, alors 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 jetteront ci-dessous exécution exception class cast

  

Exception dans le thread "principal" java.lang.ClassCastException: com.default.Animal ne peut pas être jeté à java.lang.Comparable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top