Pregunta

He leído algunos artículos escritos en "ClassCastException", pero no pude conseguir una buena idea sobre eso. ¿Hay un buen artículo o lo que sería una breve explicación?

¿Fue útil?

Solución

Directamente desde las especificaciones API para el ClassCastException :

  

Lanzado para indicar que el código tiene   intentado convertir un objeto a una   subclase de la que no es una   instancia.

Así, por ejemplo, cuando se trata de emitir un Integer a un String, String no es una subclase de Integer, por lo que un ClassCastException será lanzada.

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

Otros consejos

Es realmente bastante simple: si usted está tratando de encasillar un objeto de la clase A en un objeto de la clase B, y no son compatibles, se obtiene una excepción de difusión clase

.

Vamos a pensar en una colección de clases.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Usted puede lanzar ninguna de estas cosas al objeto, porque todas las clases de Java heredan del objeto.
  2. Puede emitir B o C a A, porque son los dos tipos de "" Un
  3. Usted puede lanzar una referencia a un objeto A a B sólo si el objeto real es un B.
  4. Usted no puede lanzar un B a un C. pesar de que son de ambos A.

Es una excepción que se produce si intenta abatido una clase, pero en realidad la clase no es de ese tipo.

Considere esta jerarquía:

  

Objeto -> Animales -> perro

Es posible que haya un método llamado:

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

Si se llama con este código:

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

Se compilará muy bien, pero en tiempo de ejecución obtendrá un ClassCastException porque o era en realidad un animal, no un perro.

En versiones posteriores de Java lo hace llegar una advertencia del compilador a menos que hagas:

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

Considere un ejemplo,

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

En Another t5 = (Another) new Goat(): obtendrá un ClassCastException porque no se puede crear una instancia de la clase utilizando Another Goat.

Nota: . La conversión es válida sólo en los casos en que una clase se extiende una clase padre y de la clase hija está fundido a su clase padre

¿Cómo hacer frente a la ClassCastException:

  1. Tenga cuidado cuando se trata de convertir un objeto de una clase a otra clase. Asegúrese de que el nuevo tipo pertenece a una de sus clases padre.
  2. Usted puede prevenir la ClassCastException mediante el uso de los genéricos, porque los genéricos proporcionan compilar controles de tiempo y se pueden utilizar para desarrollar aplicaciones con seguridad de tipos.
Fuente

de la Nota y el Resto

Usted está tratando de tratar a un objeto como una instancia de una clase que no lo es. Es más o menos análoga a tratar de presionar el pedal del freno a una guitarra (pianos tienen pedales damper, las guitarras no lo hacen).

¿Comprende el concepto de casting? De fundición es el proceso de conversión de tipo, que es muy común en Java porque es un lenguaje de tipos estáticos. Algunos ejemplos:

Reparto de la cadena "1" a un int -> no hay problema

Reparto de la cadena "abc" a un int -> plantea una ClassCastException

O pensar en un diagrama de clases con Animal.class, Dog.class y 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.

A excepción de difusión clase es lanzada por Java cuando intenta convertir un objeto de un tipo de datos a otro.

Java nos permite echamos variables de un tipo a otro, siempre y cuando ocurre la conversión entre tipos de datos compatibles.

Por ejemplo, usted puede convertir una cadena como un objeto y de manera similar un objeto que contiene los valores de cadena pueden convertirse en una cadena.

Ejemplo

Supongamos que tenemos un HashMap que contiene una serie de objetos ArrayList.

Si escribimos código como este:

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

sería lanzar una excepción de difusión de clase, ya que el valor devuelto por el método get del mapa hash sería una lista de arreglo, pero estamos tratando de echarlo a una cadena. Esto haría que la excepción.

Un muy buen ejemplo que puedo dar para ClassCastException en Java es durante el uso de "Colección"

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

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

Este código le dará ClassCastException en tiempo de ejecución. Debido a que usted está tratando de echar entero en cadena, que va a emitir la excepción.

Puede comprender mejor ClassCastException y emitan una vez que se da cuenta de que la JVM no puede adivinar lo desconocido. Si B es una instancia de una que tiene más miembros de la clase y métodos sobre el montón que A. La JVM no puede adivinar cómo lanzar la A a la B, ya que el objetivo de mapeo es más grande, y la JVM no sabrá cómo llenar los miembros adicionales.

Pero si A era una instancia de B, sería posible, porque A es una referencia a una instancia completa de B, por lo que el mapeo será uno-a-uno.

Una de Java ClassCastException es una excepción que puede ocurrir cuando intenta convertir incorrectamente una clase de un tipo a otro.

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 intenta ejecutar este programa Java verá que va a lanzar el siguiente ClassCastException:

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

La razón se produce una excepción aquí es que cuando estoy creando mi lista de objetos, el objeto almaceno en la lista es la cadena “uno”, pero luego cuando trato de conseguir este objeto fuera intencionalmente hacer una error al tratar de echarlo a un entero. Debido a que una cadena no se puede convertir directamente a un Integer - Integer no es un tipo de secuencia -. ClassCastException se lanza un

Si desea ordenar los objetos, pero si la clase no implementó Comparable o Comparator, por lo que recibirá ClassCastException Por ejemplo

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

Por encima principal método lanzará más adelante en tiempo de ejecución excepción de difusión clase

  

Excepción en hilo "principal" java.lang.ClassCastException: com.default.Animal no se puede convertir a java.lang.Comparable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top