Explication de "ClassCastException" en Java
j'ai lu quelques articles écrits sur" ClassCastException", mais je n'ai pas pu avoir une bonne idée de cela. Y a-t-il un bon article ou une brève explication?
11 réponses
directement des spécifications API pour le ClassCastException
:
lancé pour indiquer que le code a tenté d'associer un objet à un sous-classe dont il n'est pas un instance.
Ainsi, par exemple, lorsque l'on essaie de lancer un Integer
à un String
, String
n'est pas une sous-classe de Integer
, donc un ClassCastException
sera levée.
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
c'est vraiment assez simple: si vous essayez de taper un objet de la classe A dans un objet de la Classe B, et qu'ils ne sont pas compatibles, vous obtenez une exception de cast de classe.
pensons à une collection de classes.
class A {...}
class B extends A {...}
class C extends A {...}
- vous pouvez lancer n'importe laquelle de ces choses à L'objet, parce que toutes les classes Java héritent de L'objet.
- vous pouvez lancer B ou C à A, parce qu'ils sont tous les deux" genre de "A
- Vous pouvez lancer une référence à Un objet de B seulement si l'objet réel est un B.
- on ne peut pas jeter un B sur un C même si ce sont deux A.
C'est une Exception qui se produit si vous tentez d'baissés une classe, mais en fait, la classe n'est pas de ce type.
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 compilera très bien, mais à 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 de compilateur à moins que vous ne le fassiez:
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();
}
}
à 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
.
Note : la conversion n'est valable que dans les cas où une classe étend une classe parent et où la classe enfant est castée à sa classe parent.
la Façon de traiter avec les ClassCastException
:
- faites attention en essayant de lancer un objet d'une classe dans une autre classe. S'assurer que le nouveau type appartient à l'une de ses classes parentes.
- vous pouvez empêcher la ClassCastException en utilisant Generics, parce que Generics fournissent des vérifications de temps de compilation et peuvent être utilisés pour développer des applications sans risque de type.
comprenez-vous le concept de casting? Casting est le processus de conversion de type, qui est en Java très commun parce que son un langage statiquement typé. Quelques exemples:
"151910920 de" lancer la Chaîne "1" int -> pas de problèmelancer la chaîne "abc" à un int - > élève 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.
que Vous essayez de traiter un objet comme une instance d'une classe qu'il ne l'est pas. C'est à peu près comme essayer d'appuyer sur la pédale d'amortissement d'une guitare (les pianos ont des pédales d'amortissement, pas les guitares).
une exception de classe cast est lancée par Java lorsque vous essayez de cast un objet d'un type de données à un autre.
Java nous permet de lancer des variables d'un type à un autre aussi longtemps que le casting se produit entre des types de données compatibles.
par exemple, vous pouvez lancer une chaîne de caractères comme un objet et de la même manière un objet qui contient des valeurs de chaîne de caractères peut être lancé sur une chaîne de caractères.
exemple
supposons que nous avons un HashMap qui contient un certain nombre d'objets ArrayList.
si nous écrivons un code comme ceci:
String obj = (String) hmp.get(key);
il lancerait une exception de classe cast, parce que la valeur retournée par la méthode get de la carte de hachage serait une liste de tableau, mais nous essayons de la lancer à une chaîne. Cela causerait l'exception.
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 sur runtime. Parce que vous essayez de lancer entier à chaîne, qui va jeter l'exception.
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 y a plus de membres de classe et de méthodes sur le tas que A. la JVM ne peut pas deviner comment lancer A à B puisque 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, parce que A est une référence à une instance complète de B, donc la cartographie sera l'un-à-un.
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 la 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 lancé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 quand j'essaie d'obtenir ceci object out je fais intentionnellement une erreur en essayant de le jeter à un entier. Parce qu'une chaîne ne peut pas être directement coulée sur un entier - un entier n'est pas un type de chaîne - une ClassCastException est lancée.
si vous voulez trier des objets mais si la classe N'a pas implémenté Comparable ou 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 lancera en dessous de la classe d'exécution cast exception
Exception dans le thread" main " java.lang.ClassCastException: com.défaut.Animal ne peut pas être jeté à java.lang.Comparable