[KfS05] Kotlin Features: Kotlin vs NullPointerException

Kotlin by JetBrains

En este articulo hablaremos sobre una característica de Kotlin que es muy interesante y es el manejo de Null dentro del lenguaje. Cuando trabajar en Java y Android uno de los errores mas comunes que nos podemos encontrar es el famoso NullPointerException, que terminan en un no muy grato mensaje como:

NullPointerException eres tu?

Esto sucede cuando intentamos usar una variable que ha sido declarada pero no inicializada, por tanto su valor es Null y al intentar operar sobre un valor Null, pues vemos los resultados. Ahora en Kotlin ninguna variable aceptara Null como valor de inicialización de forma explicita.

En este ejemplo podemos apreciar que sin importar si declaramos como mutable o inmutable el resultado sera el mismo. Ahora veamos el motivo; En la documentación de Kotlin nos comentan que el sistema de tipado fue diseñado para no aceptar valores y referencias Null, esto con la finalidad de minimizar al máximo los NPE.

Nada es Null hasta que le digas lo contrario.

No obstante, Kotlin nos permite asignar valores Null a las variables, pero debemos hacerlo de forma explicita, eso se logra con agregando ? a final del tipo, veamos el ejemplo anterior pero permitiendo los Null:

En este caso es bueno recordar el buen Uncle Ben:

Aceptar Null conlleva una gran responsabilidad

Debido a la naturaleza Null Safety de Kotlin al aceptar valores Null deberemos verificar que antes de hacer una operación con dicha variable o referencia esta no sea null:

Safe Calls

Con esa modificación nuestro código arriba funcionará sin problemas, ahora bien Kotlin cuenta con algo llamado operador Safe Call (?.) que nos permite hacer la verificación de si una variable es null antes de aplicar alguna operación sobre ella, siguiendo el ejemplo del String podemos simplificar el código de la siguiente forma:

Kotlin is ❤

Operador Elvis

Genial poder usar el operador Safe Call, pero en el caso donde además de validar si el valor es null o no queremos regresar un valor por defecto eso lo podemos hacerlo con el operador Elvis (?:), sigamos en el caso del largo de la cadena pero esta vez si la cadena es null el valor, al imprimir la función diga que su doble es -1.

Eso no arrojará la siguiente salida:

Operador Elvis en Accion!! :D

EL Operador !!

Kotlin es todo un mundo y todos tenemos lugar, Kotlin nos ofrece un tercer operador pensando en aquellos Dev que son NPE-lovers. El operador !! lo que hace es saltarse la verificación de si el valor es nulo o no y aplicar las operaciones sobre el mismo. Aunque esta opción existe debe manejar con pie de plomo y evitarla lo mas posible, debido a que podemos llevarnos sorpresas como las siguiente:

Fragmento modificado para usar el operador !!
NullPointerException :’(

NullPointerException en Kotlin

Como podemos ver NPE es posible en Kotlin, En la documentacion nos indican algunos casos en los que se pueden generar:

  • Llama explicita a throw new NullPointerException()
  • El uso del operador !!
  • Código Java externo que lo ocasione. (Por ejemplo una lib. Java de terceros)
  • Inconsistencia con el tipo de dato al inicializar.

Por tanto Kotlin no es una Silver Bullet para evitar de forma definitiva los NPE pero si nos da una base solida y segura para evitarlos al máximo.

Curiosidad

Al principio dijimos que para aceptar null en variables deberíamos decirlo de forma explicita, pues jugando un poco con Kotlin he recordado que tiene la inferencia de tipado. Que pasaría si usara esa inferencia para ver como Kotlin maneja un null y me he topado con que lo infiere del tipo Nothing?.

Al investigar un poco en la documentación la clase Nothing es una clase que no tiene instancia, es decir es usada para “Un valor que nunca existió” o una función que nunca retorna (Arroja un Exception). aquí el enlace a la doc: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-nothing.html

Si quieres seguir esta serie de artículos, puedes verlos todos desde aquí:

Happy Coding!!