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 NullPointerException
en 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 str1
que se encuentra null
.
Una solución fácil para esto es agregar una verificación nula en str1
Como se muestra abajo:
private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }
Esto asegurará que, cuando str1
esnull
, 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 null
marcar 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 null
cheque 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 @NonNull
anotación.
Además, cuando llamamos a esta función, colocamos un try-catch
bloque 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-catch
bloque.
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 null
declaraciones de verificación. Pero usar Lombok nos ayuda a evitar escribir múltiples null
declaraciones 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 null
marcar la lista.
Si el null
cheque no está presente, entonces intentar recorrer una null
lista 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
, NullPointerException
se 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 null
cheque. 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 NullPointerException
en 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.