Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: erivalo en 22 de Marzo 2015, 21:48

Título: CU00678B java.lang.ClassCastException: java.lang.Integer cannot be cast String
Publicado por: erivalo en 22 de Marzo 2015, 21:48
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?
Título: Re:Solucion Ejercicio CU00678B - Concepto definición de polimorfismo en Java
Publicado por: toni_apr en 23 de Marzo 2015, 15:50
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
Título: Re:CU00678B java.lang.ClassCastException: java.lang.Integer cannot be cast String
Publicado por: erivalo en 29 de Marzo 2015, 18:37
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

}
}