Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Mercedes en 11 de Junio 2017, 19:07
-
Hola! Estoy haciendo el ejercicio planteado en el apartado CU00665B del curso básico de Java, y cuando lo ejecuto me aparece un error de java.lang.NullPointerException. No me doy cuenta cual es el error. Les paso el código completo, espero puedan ayudarme! Gracias!
import java.util.*;
public class ListaCantantesFamosos
{
public ArrayList<String> cantantes;
public void ListaCantantesFamosos()//inicializo el array
{
cantantes = new ArrayList<String>();
cantantes.add("Pedro");
cantantes.add("Chayanne");
cantantes.add("Porta");
}
public void addNombre(String nombre){cantantes.add(nombre); }//agregar nuevos cantantes
public void mostrarLista(){//muestro la lista completa
for (int i=0;i<=cantantes.size();i++){
System.out.println("Cantante "+i+" "+cantantes.get(i));
}
}
public String getNombre(int pos)//muestro un nombre en dicha posicion
{
if (pos>0 && pos <= cantantes.size())
{
return cantantes.get(pos);
}else{
return "No existe cantante en la posicion requerida";
}
}
}
import java.util.*;
public class Main
{
public static void main(String[] args){
ListaCantantesFamosos lista = new ListaCantantesFamosos();
Scanner entradae = new Scanner (System.in);
for(int i=0;i<3;i++){
System.out.println("Ingrese un nuevo Cantante: ");
lista.addNombre(entradae.nextLine());
}
lista.mostrarLista();
}
}
-
Seguramente el error está en este método, concretamente en la condición del bucle for
public void mostrarLista(){//muestro la lista completa
for (int i=0;i<=cantantes.size();i++){
System.out.println("Cantante "+i+" "+cantantes.get(i));
}
}
Al recorrer vectores, arrayList y similares... el indice del bucle nunca debe ser igual al tamaño del array.
Supongamos que tienes 4 cantantes en el arrayList
Si tienes 4, estos cantantes están numerados del 0 al 3, es decir: 0,1,2,3
Entonces si al bucle le dices que el indice i aumente hasta que sea menor o igual que cantantes.size():
for (int i=0;i<=cantantes.size();i++)
Puesto que cantantes.size() es igual a 4 (porque suponemos que tenemos 4 canantes)...le estas diciendo que empiece por la posicion 0 y vaya hasta la posicion 4.
Pero las posiciones en este caso son solo 0, 1 ,2 y 3...
Por eso, cuando intenta leer la posicion 4 del arraylist, como no existe, ocurre una excepcion de NullPointer.
Es decir, "Puntero Nulo", le has pedido que apunte a una posicion del arrayList que no existe (la posicion 4)
Para que el bucle for no se pase, tienes que decirle que la i ha de aumentar mientras sea menor que cantantes.size()
for (int i=0;i<cantantes.size();i++)
DE este modo, recorrerá la posicion 0, 1,2,3... y cuando la i valga 4, el bucle finalizará y no intentará leer la posicion 4, la cuál no existe.
Prueba a hacer ese pequeño cambio y a ver si ahora sí te funciona
-
Tenés razón, no me había dado cuenta de eso, pero el error me lo marca en la función addNombre.
Lo corregí y sigue marcandome el mismo error, señalando la función addNombre
-
Ok, veo otro error.
En el constructor:
public void ListaCantantesFamosos()//inicializo el array
{
cantantes = new ArrayList<String>();
cantantes.add("Pedro");
cantantes.add("Chayanne");
cantantes.add("Porta");
}
Quita el void, los constructores son métodos especiales y no tienen que devolver nada, ni siquiera void.
Déjalo así:
public ListaCantantesFamosos()//inicializo el array
{
cantantes = new ArrayList<String>();
cantantes.add("Pedro");
cantantes.add("Chayanne");
cantantes.add("Porta");
}
Si lo quitas funcionará, al menos a mi me está funcionando
-
Mil gracias! Se me re pasó lo del constructor! Estoy hace dos días renegando con lo mismo, y era el constructor! jaja Muchas gracias! ;D
-
Yo a veces he estado semanas atascado por tonterías como esta.
Que por cierto, en este caso me he dado cuenta porque me ha avisado Eclipse, el IDE que utilizo habitualmente para escribir mis programas.
Al copiar tu código, Eclipse me había puesto un "warning", un aviso indicándome que le parecía raro que un método tuviera el mismo nombre que la clase.
Es decir, al poner void, lo que pasaba es que Java ya no lo consideraba un constructor de la clase, si no que que lo estaba tratando como un método cualquiera.
Por lo tanto, en realidad tu clase carecía de constructor y el arrayList no estaba siendo inicializado.
Por eso al intentar añadir cantantes, se producía la excepción, porque el arrayList no estaba inicializado.
Al quitar lo de void, ahora ese método si es reconocido como un constructor de la clase, y entonces el ArrayList sí que se inicializa bien.