Cómo manejar NullPointerException en Java

Si ha pasado algún tiempo desarrollando programas en Java, en algún momento definitivamente ha visto la siguiente excepción:

java.lang.NullPointerException

Surgen algunos problemas importantes de producción debido a NullPointerException. En este artículo, repasaremos algunas formas de manejar NullPointerExceptionen Java.

Comprobación nula simple

Considere el siguiente fragmento de código:

public static void main(String args[]) { String input1 = null; simpleNullCheck(input1); } private static void simpleNullCheck(String str1) { System.out.println(str1.length()); }

Si ejecuta este código tal como está, obtendrá la siguiente excepción:

Exception in thread "main" java.lang.NullPointerException

La razón por la que recibe este error es porque estamos intentando realizar el length()operación en la str1que se encuentra null.

Una solución fácil para esto es agregar una verificación nula en str1Como se muestra abajo:

private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }

Esto asegurará que, cuando str1esnull, no ejecuta el length()función en él.

Pero es posible que tenga la siguiente pregunta.

¿Qué pasa si str1 es una variable importante?

En ese caso, puede intentar algo como esto:

 private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } else { // Perform an alternate action when str1 is null // Print a message saying that this particular field is null and hence the program has to stop and cannot continue further. } }

La idea es que, cuando esperas que un valor sea null, es mejor nullmarcar esa variable. Y si el valor resulta serlo null, tome una acción alternativa.

Esto es aplicable no solo a cadenas, sino a cualquier otro objeto en Java.

Verificación nula de Lombok

Ahora tome el siguiente ejemplo:

public static void main(String args[]) { String input2 = "test"; List inputList = null; lombokNullCheck(input2, inputList, input2); } public static void lombokNullCheck(String str1, List strList, String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Aquí tenemos una función que acepta tres argumentos: str1, strList, y str2.

Si alguno de estos valores resulta ser null, no queremos ejecutar la lógica en esta función en absoluto.

¿Cómo lo logras?

Aquí es donde Lombok es útil. Para agregar la biblioteca Lombok en su código, incluya la siguiente dependencia de Maven:

  org.projectlombok lombok 1.18.12 provided 

Para obtener más información sobre Maven, consulte este artículo.

Así es como se vería el código con el nullcheque de Lombok :

public static void main(String args[]) { String input2 = "test"; List inputList = null; try { lombokNullCheck(input2, inputList, input2); } catch (NullPointerException e) { System.out.println(e); } } public static void lombokNullCheck(@NonNull String str1, @NonNull List strList, @NonNull String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Antes de cada argumento de la función agregamos @NonNullanotación.

Además, cuando llamamos a esta función, colocamos un try-catchbloque alrededor de la llamada a la función para capturar NullPointerException.

Si cualquiera de los argumentos dados en la función resulta ser null, la función arrojaría un NullPointerException. Esto entonces sería capturado por el try-catchbloque.

Esto asegura que, si alguno de los argumentos de la función resulta serlo null, la lógica de la función no se ejecuta y sabemos que el código no se comportará de manera inusual.

Esto también se puede hacer con un montón de nulldeclaraciones de verificación. Pero usar Lombok nos ayuda a evitar escribir múltiples nulldeclaraciones de verificación y hace que el código se vea mucho más limpio.

Listas y nulos

Digamos que tiene una lista y desea imprimir todos los elementos de la lista:

List stringList = new ArrayList(); stringList.add("ele1"); stringList.add("ele2"); if (stringList != null) { for (String element : stringList) System.out.println(element); }

Antes de recorrer la lista, debemos nullmarcar la lista.

Si el nullcheque no está presente, entonces intentar recorrer una nulllista arrojará un NullPointerException.

Mapas y nulos

Tomemos el escenario en el que necesita acceder al valor de una clave en particular en un mapa:

Map testMap = new HashMap(); testMap.put("first_key", "first_val"); if (testMap != null && testMap.containsKey("first_key")) { System.out.println(testMap.get("first_key")); }

Primero necesitamos hacer una verificación nula en el objeto de mapa en sí. Si esto no se hace y el mapa sí null, NullPointerExceptionse lanza a. Esto se hace usandotestMap!=null

Una vez hecho esto, verifique si una clave en particular está presente antes de acceder a ella. Puede comprobar la presencia de la clave utilizando testMap.containsKey("first_key"). Si esto no se hace y la clave en particular está ausente, obtendrá el valor como null.

¿Es necesario agregar siempre un cheque nulo?

Si sabe con certeza que una variable en particular nunca puede serlo null, puede evitar agregar el nullcheque. Esto puede aplicarse en funciones privadas donde puede controlar los datos que entran en funcionamiento.

Pero si no está realmente seguro de la posibilidad de nulidad de un objeto, es mejor agregar una marca null.

Código

Todo el código discutido en este artículo se puede encontrar en este repositorio de Github.

Felicidades ?

¡Ahora sabes cómo manejar NullPointerExceptionen Java!

Sobre el Autor

Amo la tecnología y sigo los avances en el campo. También me gusta ayudar a otros con mis conocimientos de tecnología.

Siéntase libre de leer más de mis artículos en mi blog, conectarse conmigo en LinkedIn o seguirme en Twitter.