Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Susana83 en 22 de Septiembre 2014, 18:23
-
Hola! Estoy estudiando java y no entiendo por qué salta warning y por qué salta luego un error en este código
Dejo el código:
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// declaration
List list = new ArrayList();
Iterator elements = list.iterator();
// als some elements to the list
list.add("par");
list.add("arroz");
list.add("harina");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("arroz");
// duplicate element, is added to list
list.add(new Integer(4)); // duplicate, is added
// Print contents of the list
while (elements.hasNext()) {
System.out.println(elements.next());
} // while
} // main
} // class
-
Hola Susana, bueno intentare explicarte lo que te esta ocurriendo.
Si te fijas en tu código, creas una lista:
List list = new ArrayList();
Hasta aquí bien, en tu siguiente linea, creas el iterador.
Iterator elements = list.iterator();
El problema es que cuando le pides a la lista que te pase un iterador, la lista aun esta vacía, por lo tanto te devuelve un iterador sin elementos, y eso es lo que te provoca el error. Para resolverlo, basta con rellenar la lista primero y tras rellenarla crear el iterador. El código te quedaría de la siguiente manera:
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// declaration
List list = new ArrayList();
// als some elements to the list
list.add("par");
list.add("arroz");
list.add("harina");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("arroz");
// duplicate element, is added to list
list.add(new Integer(4)); // duplicate, is added
Iterator elements = list.iterator();
// Print contents of the list
while (elements.hasNext()) {
System.out.println(elements.next());
} // while
} // main
} // class
Eso es sobre el error en tiempo de ejecucion que todo venia por que el iterador no contenía elementos.
Sobre los warnings, a mi me saltan 3, El mensaje es algo así como Unnecesary boxes patatin patatan...
Eso solo es un warning y significa que no era necesario crear los objetos explicitamente, ya que como estas creando una lista de Object, podrías haberlos puesto implicitamente y la maquina de java se encargaría de encapsular cada tipo, por tanto para que desaparezcan los warnings, basta con este código:
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// declaration
List list = new ArrayList();
// als some elements to the list
list.add("par");
list.add("arroz");
list.add("harina");
list.add(4);
list.add(5.0F);
list.add("arroz");
// duplicate element, is added to list
list.add(4); // duplicate, is added
Iterator elements = list.iterator();
// Print contents of the list
while (elements.hasNext()) {
System.out.println(elements.next());
} // while
} // main
} // class
Y bueno espero habértelo resuelto todo. Un saludo!
-
Gracias por la explicacion dongo. El programa ahora funciona aunque aparece warning: "ListExample.java uses unchecked or unsafe operations" y no se por qué :'(
-
Hola Susana83!
Respecto a tu inquietud sobre el warning que salta con relación al ultimo código en este hilo, te comento lo siguiente:
Lo primero a tener en cuenta es, que contiene tu ArrayList? Tu ArrayList contiene objetos, todos los objetos son del tipo definido por su clase, en tu ArrayList tenemos instancias (objetos) de las clases String, Integer y Float.
En esta linea de tu codigo: List list = new ArrayList ();
Lo correcto seria usar una sintaxis como: List<TipoDeObjeto> list = new ArrayList<TipoDeObjeto>();
donde TipoDeObjeto indica el tipo de objeto que contendra la lista, ahora bien! te podrias preguntar, si mi lista contiene tres tipos diferentes (String, Integer, Float), cual es el que debo de usar aquí?
Aquí es donde entra lo que se conoce como "polimorfismo" el polimorfismo se cumple cuando un objeto puede ser declarado tanto del tipo definido por su clase, como del tipo de una clase de la cual herede, o implemente su propia clase (clase originaria del objeto). Si tenemos en cuenta que todas las clases heredan de la clase Object, pues podriamos concluir que una solución a esto seria esta: List<Object> list = new ArrayList<Object>();
y lo mismo para el Iterator: Iterator<Object> elements = list.iterator();
Tu código en general quedaría así:
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// declaration
List<Object> list = new ArrayList<Object>();
// als some elements to the list
list.add("par");
list.add("arroz");
list.add("harina");
list.add(4);
list.add(5.0F);
list.add("arroz");
// duplicate element, is added to list
list.add(4); // duplicate, is added
Iterator<Object> elements = list.iterator();
// Print contents of the list
while (elements.hasNext()) {
System.out.println(elements.next());
} // while
} // main
} // class
Con esto queda resuelto lo del warning, espero que te sea útil mi explicación.
Saludos!
-
Tienes razon Sniper el warning desaparece mi duda venia en habiendo muchos tipos de datos no saber qué tipo de dato usar, pero con Object funciona a la perfección. Gracias por vuestra ayuda!!!