Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Mercedes en 11 de Junio 2017, 19:07

Título: java.lang.NullPointerException error Java Eclipse cómo detectar fallo CU00665B
Publicado 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!

Código: [Seleccionar]
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";
        }
    }
}

Código: [Seleccionar]
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();
   }
  }


Título: Re:Ejercicio (CU00665B) aprender a programar desde cero java
Publicado por: Kabuto en 11 de Junio 2017, 21:25
Seguramente el error está en este método, concretamente en la condición del bucle for

Citar
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():
Citar
        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()
Citar
        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
Título: Re:Ejercicio (CU00665B) aprender a programar desde cero java
Publicado por: Mercedes en 11 de Junio 2017, 21:44
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
Título: Re:Ejercicio (CU00665B) aprender a programar desde cero java
Publicado por: Kabuto en 11 de Junio 2017, 22:22
Ok, veo otro error.

En el constructor:

Citar
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í:
Citar
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
Título: Re:Ejercicio (CU00665B) aprender a programar desde cero java
Publicado por: Mercedes en 11 de Junio 2017, 22:25
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
Título: Re:Ejercicio (CU00665B) aprender a programar desde cero java
Publicado por: Kabuto en 11 de Junio 2017, 22:39
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.