Autor Tema: Error java.lang.NullPointerException en java  (Leído 5633 veces)

Susana83

  • Sin experiencia
  • *
  • Mensajes: 49
    • Ver Perfil
Error java.lang.NullPointerException en java
« en: 24 de Octubre 2014, 13:52 »
Hola a todos, tratando de comprender por qué en este código me salta error java nullpointerexception gracias de antemano (I)

Código: [Seleccionar]
import java.util.Scanner;

public class Test1 {

private static final Scanner in=new Scanner(System.in);
public static void main(String[] args) {
   int n1=lerTamanho();
   String [] vec1=new String [n1];
   readVector(vec1); 
}

private static int lerTamanho() {
    System.out.print("Numero: ");
    int num=in.nextInt();
    while (num<=0) {
        System.out.print("Error! Numero: ");
        num=in.nextInt();
    }
    return num;
}

private static void readVector(String vec[]) {
    int cont=0;
    String s;
    do  { 
        System.out.print("Nombre: ");
        s=in.nextLine();
        if (validate(s,vec)) {
            vec[cont]=s;
            cont++;
        } else {
            System.out.println("Ese nombre ya existe!");
        }
    } while (cont<vec.length);
    }
private static boolean validate(String s, String vec[]) {
    boolean success=true;
    for (int i=0; i<vec.length; i++) {
        if (vec[i].equalsIgnoreCase(s)) {
            return !success;
        }
    }
    return success;
}

}
« Última modificación: 24 de Octubre 2014, 16:18 por Jorge lopez »

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
    • Twitter @Sniperofelite
Re: Error java.lang.NullPointerException en java
« Respuesta #1 en: 24 de Octubre 2014, 16:17 »
 Hola Susana83!

El error en java java.lang.NullPointerException
nos indica que estamos intentando realizar una tarea con una variable cuyo valor es "null"
(nulo, sin valor asignado, ext..) y que el jvm (java virtual machine) al ejecutar el programa espera encontrar en dicha variable un valor diferente a "null" por tal motivo cuando en tiempo de ejecución el jvm se encuentra con un valor "null" en vez de un valor esperado, pues lanza este error: java.lang.NullPointerException.

Este es un error muy frecuente principalmente entre nuevos programadores, y este error puede surgir a raíz de diferentes situaciones, como por ejemplo: Cuando definimos una variable tipo objeto pero no la inicializamos, o por ejemplo cuando declaramos un vector he intentamos recorrer su contenido sin antes a ver rellenado dicho vector,
(que por cierto este ultimo es tu caso) y a estos dos casos los cuales para mi son los mas comunes se podrían sumar otros casos mas.

Que hacer ante un error de tipo java.lang.NullPointerException? Lo primero que debemos de hacer es identificar la variable asociada a tal error, en bluej esto nos resulta un tanto "sencillo" puesto que bluej resalta en amarillo la linea de código donde interviene dicha variable. Una vez identificamos la variable pues procedemos a hacer que esta deje de referenciar a un objeto o valor "null" Como? pues asignándole un valor, y lógicamente dicho valor tiene que coincidir con el tipo de variable.

En tu código el error se encuentra en el siguiente fragmento de código:
Código: [Seleccionar]
private static boolean validate(String s, String vec[]) {
    boolean success=true;
    for (int i=0; i<vec.length; i++) {
        if (vec[i].equalsIgnoreCase(s)) {
            return !success;
        }
    }
    return success;
}
Donde por parámetros se deben introducir un String y un vector de String, hasta aquí todo esta bien, el problema surge en esta linea:
Código: [Seleccionar]
if (vec[i].equalsIgnoreCase(s)) { donde nunca se cumplirá esta condición porque el vector "vec" no contiene elementos (su valor contenido es null) por tanto tampoco contiene el valor de "s".

Una posible solución seria que asignes un valor (rellenar el vector vec) según lo necesario para que tu programa responda como esperas.

Espero que desde ahora puedas dominar un java.lang.NullPointerException. Y por supuesto, si tienes alguna duda no dudes en preguntar.

Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}
By: https://twitter.com/SniperOfElite

Susana83

  • Sin experiencia
  • *
  • Mensajes: 49
    • Ver Perfil
Re:Error java.lang.NullPointerException en java
« Respuesta #2 en: 27 de Octubre 2014, 08:10 »
Muchas gracias por responder! He hecho el cambio pero ahora tengo otro problema, me aparece Nombre: Nombre: en lugar de Nombre: ¿por que?

Código: [Seleccionar]
import java.util.Scanner;
import java.util.Arrays;

public class Test1 {

    private static final Scanner in=new Scanner(System.in);
    public static void main(String[] args) {
        int n1=lerTamanho();
        String [] vec1=new String [n1];
        Arrays.fill(vec1, "s");
        readVector(vec1); 
    }

    private static int lerTamanho() {
        System.out.print("Numero: ");
        int num=in.nextInt();
        while (num<=0) {
            System.out.print("Error! Numero: ");
            num=in.nextInt();
        }
        return num;
    }

    private static void readVector(String vec[]) {
        int cont=0;
        String s;
        do  { 
            System.out.print("Nombre: ");
            s=in.nextLine();
            if (validate(s,vec)) {
                vec[cont]=s;
                cont++;
            } else {
                System.out.println("Ese nombre ya existe!");
            }
        } while (cont<vec.length);
    }

    private static boolean validate(String s, String vec[]) {
        boolean success=true;
        for (int i=0; i<vec.length; i++) {
            if (vec[i].equalsIgnoreCase(s)) {
                return !success;
            }
        }
        return success;
    }

}

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
    • Twitter @Sniperofelite
Re:Error java.lang.NullPointerException en java
« Respuesta #3 en: 27 de Octubre 2014, 17:00 »
 Hola Susana83!

Al parecer este "error" en tiempo de ejecución lo esta generando el método nextLine(); de la clase Scanner. A continuación dejo tu código editado y comentado en los puntos editados, y por su puesto, también he corregido el error.
Código: [Seleccionar]
import java.util.Scanner;
import java.util.Arrays;
public class Test1
{
    private static final Scanner in = new Scanner(System.in);
    public static void main(String[] args)
    {
        System.out.print("Indique la cantidad de nombres que contendrá el vector: ");
        int n1 = lerTamanho();
        String[] vec1 = new String [n1];
        Arrays.fill(vec1, "default");
        System.out.println("\nContenido inicial del vector:\n");
        for(String obj: vec1)//Mostramos el contenido del vector rellenado por el método fill(Object[] a, Object val); con el (nombre) String "default"
        {
          System.out.println(obj);
        }
        System.out.println("");
        System.out.println("Por favor indique a continuacion los " + vec1.length + " nombres que contendra el vector:\n");
        readVector(vec1);
        System.out.println("\nContenido actual del vector:\n");
        for(int i = 0; i < vec1.length; i++)/*Usamos un for tradicional en ves de un for-each, puesto que el for tradicional incluye un contador o indice (i) el cual
        usamos para enumerar los nombres*/
        {
          String obj = vec1[i];
          System.out.println("Nombre " + (i+1) + ": " + obj);
        }
    }

    private static int lerTamanho()
    {
        int num = in.nextInt();
        while (num <= 0)
        {
            System.out.print("Error! Indique un numero mayor que 0: ");
            num=in.nextInt();
        }
        return num;
    }

    private static void readVector(String vec[]) {
        int cont=0;
        String s;
        do 
        { 
            System.out.print("Nombre " + (cont + 1) + ": ");
            s=in.next();/*El problema de repeticion (Nombre: Nombre:) lo estaba generando el metodo nextLine(); el cual fue sustituido por el metodo next();
            de la clase Scanner*/
            if (validate(s,vec))
            {
                vec[cont]=s;
                cont++;
            } else {
                System.out.println("Ese nombre ya existe, intente con un nombre diferente!");
            }
        } while (cont<vec.length);
    }

    private static boolean validate(String s, String vec[])
    {
        boolean success=false;
        for (int i=0; i<vec.length; i++)
        {
            if (vec[i].equalsIgnoreCase(s))
            {
                return success;
            }
        }
        return !success;
    }
}

Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}
By: https://twitter.com/SniperOfElite

Susana83

  • Sin experiencia
  • *
  • Mensajes: 49
    • Ver Perfil
Re:Error java.lang.NullPointerException en java
« Respuesta #4 en: 31 de Octubre 2014, 12:14 »
Gracias me estan ayudando mucho tus orientaciones, he probado y el codigo funciona perfecto!!!

 

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