logo

Excepción de puntero nulo en Java

En este tutorial, aprenderemos la excepción del puntero nulo en Java. La excepción de puntero nulo es una excepción de tiempo de ejecución. Nulo es un tipo especial de valor que se puede asignar a la referencia de un objeto. Siempre que uno intenta utilizar una referencia que tiene el valor nulo, se genera la excepción NullPointerException.

poda alfa beta

Diferentes escenarios para la excepción del puntero nulo

Observe algunos de los siguientes escenarios en los que se puede generar NullPointerException.

  • Calcular el tamaño o la longitud del Null como si fuera una matriz de elementos.

Nombre del archivo: ThrowNullExcep.java

 public class ThrowNullExcep { // main method public static void main(String args[]) { int arr[] = null; // array is assigned a null value System.out.println('The length of the array arr is: ' + arr.length); } } 

Producción:

Excepción en el hilo 'principal' java.lang.NullPointerException: no se puede leer la longitud de la matriz porque '' es nulo en ThrowNullExcep.main (ThrowNullExcep.java:7)
  • Llamar a un método utilizando el objeto que tiene el valor nulo.

Nombre del archivo: ThrowNullExcep1.java

 public class ThrowNullExcep1 { public void foo() { System.out.println('In the method foo.'); } public static void main(String args[]) { ThrowNullExcep1 obj = null; // assigning null value // invoking the method foo() obj.foo(); } } 

Producción:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Cuando intenta sincronizar sobre un objeto NULL.

Nombre del archivo: ThrowNullExcep2.java

 // A Java program that synchronizes over a NULL object. import java.util.*; import java.io.*; // A Class that is required for sending the message class Sendr { public void sendMethod(String mssg) { System.out.println('Sending message: ' + mssg ); try { Thread.sleep(100); } catch (Exception exp) { System.out.println('Thread interrupted.' + exp); } System.out.println('
' + mssg + ' is sent'); } } // A Class that is used to send messages with the help of threads Threads class ThreadSend extends Thread { private String mssg; Sendr sendr; // Received a messge obj and the string // mssge that has to be sent ThreadSend(String mStr, Sendr obj) { mssg = mStr; sendr = obj; } public void run() { // Only a single thread is allowed to send a message // at a time. synchronized(sendr) { // synchronizing the send object sendr.sendMethod(mssg); } } } // Driver class public class ThrowNullExcep2 { // main method public static void main(String args[]) { Sendr sendObj = null; ThreadSend Sth1 = new ThreadSend( ' Hello ' , sendObj ); ThreadSend Sth2 = new ThreadSend( ' Bye Bye ' , sendObj ); // Starting the two threads of the ThreadedSend type Sth1.start(); Sth2.start(); // waiting for the threads to end try { Sth1.join(); Sth2.join(); } catch(Exception exp) { System.out.println('Interrupted : ' + exp); } } } 

Producción:

 Exception in thread 'Thread-0' Exception in thread 'Thread-1' java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) 
  • En lugar de arrojar un valor, se arroja Null.

Nombre del archivo: ThrowNullExcep3.java

 // Modifying or accessing the fields of the Null object. public class ThrowExcep3 { int a; // main method public static void main(String args[]) { // assigning a null value ThrowExcep3 obj = null; obj.a = 3; } } 

Producción:

 Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10) 

Requisito de valor NULO

Un nulo es un valor especial que se utiliza en Java. Generalmente se usa para mostrar que no hay ningún valor asignado a la variable de referencia. Un valor nulo se utiliza principalmente en la implementación de estructuras de datos como una lista enlazada o un árbol. También se utiliza en el patrón Singleton.

Evitar la excepción NullPointerException

Para evitar NullPointerException, uno debe asegurarse de que la inicialización de todos los objetos se realice correctamente antes de poder usarlos. Cuando se declara una variable de referencia, se debe verificar que el valor nulo no esté asignado a la referencia antes de utilizar el valor de referencia para acceder al campo o método.

Observe los siguientes problemas comunes con la solución.

Caso 1: Comparación de cadenas con el literal.

Uno de los problemas comunes incluye la comparación de un literal con una variable String. El literal puede ser un elemento de un Enum o de un String. En lugar de invocar el método desde el objeto nulo, considere invocarlo usando el literal.

Nombre del archivo: NullPntrExcption.java

 import java.io.*; public class NullPntrExcption { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // The following line of code will raise the NullPointerException // It is because the pntr is null if (pntr.equals('JTP')) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Producción:

 NullPointerException has been caught. 

Ahora, veamos cómo se puede evitar.

Nombre del archivo: NullPntrExcption1.java

 public class NullPntrExcption1 { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // Now, the following line of code will not raise the NullPointerException // It is because the string literal is invoking the equals() method if ('JTP'.equals(pntr)) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Producción:

 NullPointerException has been caught. 

Caso 2: Vigilando los argumentos del método

Primero se deben verificar los argumentos del método para detectar los valores nulos y luego continuar con la ejecución del método. De lo contrario, hay muchas posibilidades de que genere una IllegalArgumentException y también indique al método de llamada que los argumentos que se han pasado son incorrectos.

Nombre del archivo: NullPntrExcption2.java

 // A program for demonstrating that one must // check the parameters are null or not before // using them. import java.io.*; public class NullPntrExcption2 { public static void main (String[] args) { // String st is an empty string and invoking method getLength() String st = ''; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // String s set to a value and invoking method getLength() st = 'JTP'; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // Setting st with a value null and invoking method getLength() st = null; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught. ' + exp); } } // method taht computes the length of a string st. // It throws and IllegalArgumentException, if st is null public static int getLength(String st) { if (st == null) { throw new IllegalArgumentException('The argument can never be null.'); } return st.length(); } } 

Producción:

 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Caso 3: Uso del operador ternario

También se puede utilizar el operador ternario para evitar NullPointerException. En ternario, la expresión booleana se evalúa primero. Si la expresión se evalúa como verdadera, se devuelve val1. De lo contrario, se devuelve val2.

Nombre del archivo: NullPntrExcption3.java

 // A program for demonstrating the fact that // NullPointerException can be avoided using the ternary operator. import java.io.*; public class NullPntrExcption3 { // main method public static void main (String[] args) { // Initializing String variable with null value String st = null; String mssge = (st == null) ? 'String is Null.' : st.substring(0, 5); System.out.println(mssge); // Initializing the String variable with string literal st = 'javaTpoint'; mssge = (st == null) ? '' : st.substring(0, 10); System.out.println(mssge); } } 

Producción:

 String is Null. javaTpoint