Autor Tema: CU00678B java.lang.ClassCastException: java.lang.Integer cannot be cast String  (Leído 4720 veces)

erivalo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenas,

Tengo este código sobre el ejercicio final de este capítulo:

Código: [Seleccionar]
import java.util.*;

public class TestEjercicio78 {
 public static void main (String [ ] Args) { 
 ArrayList<Set> arraySet = new ArrayList<Set>();
 HashSet<String> arrayString = new HashSet<String>();
 TreeSet<Integer> arrayInteger = new TreeSet<Integer>();
     
 arrayString.add("sol");arrayString.add("luna");arrayString.add("saturno");
 arrayInteger.add(2);arrayInteger.add(8);arrayInteger.add(5);
 arraySet.add(arrayString);
 arraySet.add(arrayInteger);
     
 Iterator<Set> it = arraySet.iterator();      
     
 int typeClass = 0;
 while ( it.hasNext() ) {           
  if(it.next() instanceof HashSet  ){
   System.out.println("Nombre de clase detectado: HashSet");
   typeClass = 1;}else{
   System.out.println("Nombre de clase detectado: TreeSet");
   typeClass = 2;}
   
  if (typeClass == 1){                //En caso de que sea objeto string
   Iterator<String> itString = it.next().iterator();
   String tmpAnalizandoString = "";
   int contadorString = 0;
           
 while ( itString.hasNext() ){
  System.out.println("Objeto " + contadorString +  "String detectado: " +  itString.next());
  contadorString++;
            }
            }
           
  if (typeClass == 2){                //En caso de que sea objeto integer
   Iterator<Integer> itInteger = it.next().iterator();
   Integer tmpAnalizandoInteger = 0;            
   int contadorInteger = 0;
           
   while ( itInteger.hasNext() ){
    System.out.println("Objeto " + contadorInteger +  "String detectado: " +  itInteger.next());
    contadorInteger++;
            }
            }            
        } //Cierre del while
}
}

El código en sí me tira una excepción:
Código: [Seleccionar]
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at TestEjercicio78.main(TestEjercicio78.java:45)

Según yo debería correr pero en ejecución me da este error:

Código: [Seleccionar]
System.out.println("Objeto " + contadorString +  "String detectado: " +  itString.next());

¿Pueden decirme por favor qué cambio debo hacer?
« Última modificación: 24 de Marzo 2015, 08:13 por Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola erivalo

Lo que le ocurre a tu código es que cuando entras en el arraySet con su iterador  it, utilizas dos veces it.next() antes de leer datos.
Así pues, el primer dato que lees no es el primero sino el segundo pues has dado dos saltos.

El problema está en las líneas
25    Iterator<String> itString = it.next().iterator();
36    Iterator<Integer> itInteger = it.next().iterator();

donde antes de leer, ya estas saltando al siguiente elemento usando it.next()

Solución: Cuando obtienes el primer elemento con el método it.next(), lo guardas en una variable/objeto temporal. Y usas ésta para hacer todas las consultas y asignaciones.
En cada ciclo del while se ejecutará el método it.next() dando acceso al siguiente elemento del array y así hasta terminar.

Compilando tu código he visto que dará un warning en las líneas 25 y 36
Eliminando el tipo de objeto en la declaración se soluciona.
Ejem.
    Iterator<String> itString = it.next().iterator();
cambiarla a:
    Iterator itString = it.next().iterator();

¿Por qué. Te preguntarás?. Pues porque Java en tiempo de compilación ve que este iterador it dará acceso a dos tipo de datos (String e Integer) y que en estas declaraciones puede no recibirse el objeto adecuado. Por ello el warning.
La solución, la que apuntamos. Elminar el tipo de objeto en la declaración y, ya en tiempo de ejecución Java asignará dinámicamente el tipo adecuado.

Saludos

erivalo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenos días,

te comento que cambie las líneas que me indicaste especialmente la parte de no repetir el it.next(); sin embargo no entiendo ¿por qué no me corre como yo quisiera?

En mi primer if en la línea 21:

21 if(itStringInteger instanceof HashSet  ){

obviamente no ingresa al if porque el objeto itStringInteger es del tipo <Set> entonces todos se van por el "else", pero si yo quisiera comprobar el tipo de objeto que estoy manejando ¿ Cómo hago para que este if funcione?

Código: [Seleccionar]
import java.util.*;


public class TestEjercicio78 {

public static void main (String [ ] Args) {   //main cuerpo del programa ejemplo aprenderaprogramar.com
ArrayList<Set> arraySet = new ArrayList<Set>();
     HashSet<String> arrayString = new HashSet<String>();
     TreeSet<Integer> arrayInteger = new TreeSet<Integer>();
     
     arrayString.add("sol");arrayString.add("luna");arrayString.add("saturno");
     arrayInteger.add(2);arrayInteger.add(8);arrayInteger.add(5);
     arraySet.add(arrayString);
     arraySet.add(arrayInteger);
     
     Iterator<Set> it = arraySet.iterator();
     Set tmpAnalizando;     
     
     while ( it.hasNext() ) {           //Utilizamos el método hasNext de los objetos tipo Iterator    
    Iterator itStringInteger = it.next().iterator();
    if(itStringInteger instanceof HashSet  ){
    System.out.println("Nombre de clase detectado: HashSet");    
    //En caso de que sea objeto string   
   
          int contadorString = 0;
         
          while ( itStringInteger.hasNext() ){
          System.out.println("Objeto " + contadorString +  " String detectado: " +  itStringInteger.next());
          contadorString++;
          }
    }else{
         System.out.println("Nombre de clase detectado: TreeSet");
     //En caso de que sea objeto string                    
         int contadorInteger = 0;            
            while ( itStringInteger.hasNext() ){
            System.out.println("Objeto " + contadorInteger +  " String detectado: " +  itStringInteger.next());
            contadorInteger++;
            }
            }               
        } //Cierre del while

}
}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".