Autor Tema: java.lang.NullPointerException error Java Eclipse cómo detectar fallo CU00665B  (Leído 3499 veces)

Mercedes

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
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();
   }
  }


« Última modificación: 10 de Julio 2017, 19:10 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ejercicio (CU00665B) aprender a programar desde cero java
« Respuesta #1 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
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Mercedes

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Ejercicio (CU00665B) aprender a programar desde cero java
« Respuesta #2 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

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ejercicio (CU00665B) aprender a programar desde cero java
« Respuesta #3 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
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Mercedes

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Ejercicio (CU00665B) aprender a programar desde cero java
« Respuesta #4 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

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ejercicio (CU00665B) aprender a programar desde cero java
« Respuesta #5 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.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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".