2010-08-18 16 views
18

Normalmente, ¿cuál es el motivo para obtener java.lang.ClassCastException ..? Me sale el siguiente error en mi solicitudjava.lang.ClassCastException

java.lang.ClassCastException: [Lcom.rsa.authagent.authapi.realmstat.AUTHw 
+0

Parece que no tiene el mensaje completo de excepción allí. Suponiendo que está utilizando Java 5 o posterior, la excepción debe incluir detalles de * qué * no se puede convertir a * qué * p. 'java.lang.ClassCastException: java.lang.String no se puede convertir a java.lang.Integer' – mikej

Respuesta

36

Según the documentation:

Lanzado para indicar que el código ha intentado emitir un Object a una subclase de la cual no es una instancia. Por ejemplo, el código siguiente genera un ClassCastException:

Object x = new Integer(0); 
System.out.println((String)x); 
+5

+1 para documentaton. La documentación de excepciones suele dar una buena pista de lo que podría estar mal. –

+0

+1 para documentación! Si no desea utilizar google todo el tiempo, puede descargar la fuente de la biblioteca java (o buscar si ya tiene src.zip en algún lugar de la carpeta java sdk). Luego, si lo vincula a su proyecto, puede abrir el archivo correspondiente y leer los javadocs allí ... –

+0

bine Laur, ce mic e internetul :) – ieugen

2

Es porque estás lanzando a lo incorrecto - usted está tratando de convertir a un tipo particular, y el objeto que se refiere a su expreso a que es incompatible con el tipo . Por ejemplo:

Object x = "this is a string"; 
InputStream y = (InputStream) x; // This will throw ClassCastException 

Si pueden aportar un ejemplo de código, que sería de gran ayuda ...

0
ClassA a = <something>; 
ClassB b = (ClassB) a; 

La segunda línea de fallará si no es Clase A es una subclase de ClassB, y arrojará un ClassCastException.

6

@ La respuesta de Laurenţiu Dascălu explica cómo/por qué obtiene una ClassCastException.

Tu mensaje de excepción me parece bastante sospechoso, pero podría ayudarte saber que "[Lcom.rsa.authagent.authapi.realmstat.AUTHw" significa que el tipo real del objeto que intentabas lanzar era com.rsa.authagent.authapi.realmstat.AUTHw[]; es decir, era un objeto de matriz.

Normalmente, los pasos a seguir para resolver un problema como este son:

  • examinar el StackTrace de averiguar qué línea de los cuales la clase lanzó la excepción,
  • examinar el código fuente correspondiente, para ver qué el tipo esperado, y
  • rastreando hacia atrás para ver de dónde vino el objeto con el tipo "incorrecto".
12

A ClassCastException aparece cuando intenta convertir una instancia de un objeto a un tipo que no lo es. La conversión solo funciona cuando el objeto copiado sigue una relación "es una" con el tipo al que intentas enviar. Por ejemplo

Apple myApple = new Apple(); 
Fruit myFruit = (Fruit)myApple; 

Esto funciona porque una manzana 'es una' fruta. Sin embargo, si invertimos esto.

Fruit myFruit = new Fruit(); 
Apple myApple = (Apple)myFruit; 

Esto arrojará una ClasCastException porque una fruta no es (siempre) una manzana.

Es una buena práctica para proteger las conversiones explícitas con un cheque instanceof primera:

if (myApple instanceof Fruit) { 
    Fruit myFruit = (Fruit)myApple; 
} 
+0

Si el último ejemplo cambia a 'if (instancia myFruit de Apple) {Apple myApple = (Apple) myFruit; } ', será más ilustrativo – AnnabellChan

1

Para evitar x !instance of Long prob Añadir

<property name="openjpa.Compatibility" value="StrictIdentityValues=false"/> 

en su persistencia.xml

Cuestiones relacionadas