in

Excepción de puntero nulo en Java

gfg 200x200 min

Excepción de puntero nulo es una RuntimeException. En Java, se puede asignar un valor nulo especial a una referencia de objeto. Se lanza NullPointerException cuando el programa intenta utilizar una referencia de objeto que tiene el valor nulo.

Estos pueden ser:

  • Invocar un método de un objeto nulo.
  • Acceder o modificar el campo de un objeto nulo.
  • Tomando la longitud de nulo, como si fuera una matriz.
  • Acceder o modificar las ranuras de un objeto nulo, como si se tratara de una matriz.
  • Lanzar nulo, como si fuera un valor Throwable.
  • Cuando intenta sincronizar sobre un objeto nulo.

¿Por qué necesitamos el valor nulo?
Null es un valor especial utilizado en Java. Se utiliza principalmente para indicar que no se asigna ningún valor a una variable de referencia. Una aplicación de null es la implementación de estructuras de datos como la lista y el árbol vinculados. Otras aplicaciones incluyen el patrón de objeto nulo (consulte esta para más detalles) y patrón Singleton. El patrón Singleton garantiza que solo se cree una instancia de una clase y también tiene como objetivo proporcionar un punto global de acceso al objeto.

Una forma de muestra de crear como máximo una instancia de una clase es declarar todos sus constructores como privados y luego, crear un método público que devuelva la instancia única de la clase:

import java.util.UUID;

import java.io.*;

 

class Singleton

{

    

    private static Singleton single = null;

    private String ID = null;

 

    private Singleton()

    {

        

           

           

 

        

        ID = UUID.randomUUID().toString();

    }

 

    public static Singleton getInstance()

    {

        if (single == null)

            single = new Singleton();

        return single;

    }

 

    public String getID()

    {

        return this.ID;

    }

}

 

public class TestSingleton

{

    public static void main(String[] args)

    {

        Singleton s = Singleton.getInstance();

        System.out.println(s.getID());

    }

}

Producción:

10099197-8c2d-4638-9371-e88c820a9af2

En el ejemplo anterior, una instancia estática de la clase singleton. Esa instancia se inicializa como máximo una vez dentro del método getInstance de Singleton.

¿Cómo evitar la NullPointerException?
Para evitar la NullPointerException, debemos asegurarnos de que todos los objetos se inicialicen correctamente antes de usarlos. Cuando declaramos una variable de referencia, debemos verificar que el objeto no sea nulo, antes de solicitar un método o un campo de los objetos.

A continuación se presentan los problemas comunes con la solución para superar ese problema.

Caso 1: comparación de cadenas con literales

Un problema de caso muy común implica la comparación entre una variable de cadena y un literal. El literal puede ser una cadena o un elemento de una enumeración. En lugar de invocar el método desde el objeto nulo, considere la posibilidad de invocarlo desde el literal.

import java.io.*;

 

class GFG

{

    public static void main (String[] args)

    {

        

        String ptr = null;

 

        

        try

        {

            

            

            if (ptr.equals("gfg"))

                System.out.print("Same");

            else

                System.out.print("Not Same");

        }

        catch(NullPointerException e)

        {

            System.out.print("NullPointerException Caught");

        }

    }

}

Producción:

NullPointerException Caught

Podemos evitar NullPointerException llamando a equals en literal en lugar de en un objeto.

import java.io.*;

 

class GFG

{

    public static void main (String[] args)

    {

        

        String ptr = null;

 

        

        try

        {

            if ("gfg".equals(ptr))

                System.out.print("Same");

            else

                System.out.print("Not Same");            

        }

        catch(NullPointerException e)

        {

            System.out.print("Caught NullPointerException");

        }

    }

}

Producción:

Not Same

Caso 2: Controlar los argumentos de un método

Antes de ejecutar el cuerpo de su nuevo método, primero debemos verificar sus argumentos en busca de valores nulos y continuar con la ejecución del método, solo cuando los argumentos estén correctamente verificados. De lo contrario, arrojará un Argumento de excepción ilegal y notifica al método de llamada que algo anda mal con los argumentos pasados.

import java.io.*;

 

class GFG

{

    public static void main (String[] args)

    {

        

        String s = "";

        try

        {

            System.out.println(getLength(s));

        }

        catch(IllegalArgumentException e)

        {

            System.out.println("IllegalArgumentException caught");

        }

 

        

        s = "GeeksforGeeks";

        try

        {

            System.out.println(getLength(s));

        }

        catch(IllegalArgumentException e)

        {

            System.out.println("IllegalArgumentException caught");

        }

 

        

        s = null;

        try

        {

            System.out.println(getLength(s));

        }

        catch(IllegalArgumentException e)

        {

            System.out.println("IllegalArgumentException caught");

        }

    }

 

    

    

    public static int getLength(String s)

    {

        if (s == null)

            throw new IllegalArgumentException("The argument cannot be null");

        return s.length();

    }

}

Producción:

0
13
IllegalArgumentException caught

Caso 3: Uso de operador ternario

El operador ternario se puede utilizar para evitar NullPointerException. Primero, se evalúa la expresión booleana. Si la expresion es cierto luego, se devuelve el valor1; de lo contrario, se devuelve el valor2. Podemos usar el operador ternario para manejar punteros nulos:

import java.io.*;

 

class GFG

{

    public static void main (String[] args)

    {

        

        String str = null;

        String message = (str == null) ? "" :

                          str.substring(0,5);

        System.out.println(message);

 

        

        str = "Geeksforgeeks";

        message = (str == null) ? "" : str.substring(0,5);

        System.out.println(message);

    }

}

Producción:

Geeks

La variable de mensaje estará vacía si la referencia de str es nulo como en el caso 1. De lo contrario, si str apunta a Información actual, el mensaje recuperará los primeros 6 caracteres como en el caso 2.

Artículo relacionado – Datos interesantes sobre Null en Java

Este artículo es una contribución de Nikhil Meherwal. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando contrib.geeksforgeeks.org o envíe su artículo por correo electrónico a [email protected] Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

¡Atención lector! No dejes de aprender ahora. Hazte con todo lo importante Fundación Java y conceptos de colecciones con el Curso de Fundamentos de Java y Colecciones de Java a un precio asequible para los estudiantes y prepárese para la industria. Para completar su preparación desde el aprendizaje de un idioma hasta DS Algo y muchos más, consulte Curso completo de preparación para entrevistas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

apple touch icon@2

agnóstico del lenguaje: ¿cuál es la diferencia entre pasar por referencia y pasar por valor?

WWE RAW vs WWE Smackdown – Diferencia y comparación