Ya había tardado bastante en dedicarle un artículo a una de las partes más importantes de Kotlin: el tratamiento de nulos.

El propio creador de Java denomina a los nulos “el error del billón de dólares”, pues es uno de los puntos que más errores genera cuando estás trabajando en este lenguaje.

Si miras a menudo tu gestor de bugs, seguro que el 99% de los errores que ves son NullPointerException.

Gracias a Kotlin, vas a trabajar en un entorno mucho más seguro (incluso con librerías Java), que reducirá al mínimo estos problemas.

Este artículo forma parte de una serie de 30 con motivo del lanzamiento del curso presencial de Kotlin para Desarrolladores Android que impartiré en breve.

kotlin-desarrolladores-android

Nulos en Kotlin

Los nulos en Kotlin no existen mientras no se diga lo contrario.

Es decir, a ningún objeto, por defecto, se le puede asignar null. Recuerda que en Kotlin todos los tipos son objetos.

Por tanto, esto no compilará:

Si quieres que una variable acepte nulos, tienes que marcar el tipo con una ?:

Chequeo en tiempo de compilación

Pero, a partir de ese momento, el compilador te obligará a comprobar el nulo antes de hacer nada con la variable. De esta forma, se asegura de que no se produce un NullPointerException.

Por ejemplo:

No compilará, si no compruebas primero si es nulo:

Expresión de acceso seguro

Existe una expresión mucho más sencilla para representar el ejemplo de antes, que es utilizar una ? delante del . cuando se llama a un método.

Si la variable no es nula, ejecutará la operación. En caso contrario, no hará nada:

En este caso, lo que hará si x es null, es devolver null también. Por lo que y será de tipo Double?.

El operador Elvis

¿Pero qué pasa si no queremos tener una variable nullable como resultado de la operación? El operador Elvis (?:) nos permite devolver un valor en ese caso:

Este código sería equivalente a:

Spoiler: como ves, la mayoría de las sentencias en Kotlin son a su vez expresiones. Por ejemplo, puedes asignar el resultado de un if a una variable.

Evitando el chequeo de null

Existe un operador (!!) que evitará la necesidad de chequear null si estás completamente seguro de que una variable nunca será nula.

En mi opinión, hay muy pocos casos en los que este operador tiene sentido. Casi siempre hay una solución mejor.

Pero podrías hacer lo siguiente:

Esto compilaría y produciría una NullPointerException

Lo dicho: mucho cuidado con este operador.

Compatibilidad con Java

Cuando estamos trabajando con librerías Java, podemos encontrarnos ante diferentes situaciones con respecto al chequeo de nulos.

La librería está correctamente anotada

Si se están utilizando adecuadamente las anotaciones @Nullable y @NotNull, tanto las de Java como las propias de Android, Kotlin será capaz de trabajar sin problemas con ellas para deducir cuándo una variables es nula y cuándo no.

Muchas partes del framework de Android ya están anotadas correctamente, así que esto es una ventaja enorme para trabajar con Kotlin.

La librería no tiene anotaciones

Sin embargo, si la librería no está anotada, los tipos serán marcados con un operador especial (una única !), lo que significa que queda en nuestra mano decidir si un parámetro o valor de retorno acepta nulo o no.

Si tenemos acceso al código fuente, lo mejor es comprobar qué valores acepta el código en cuestión que estemos utilizando.

Un ejemplo en Android que no está anotado es la librería de soporte de RecyclerView. Cuando creas un adapter y autogeneras los métodos, por defecto les añadirá una interrogación a los tipos.

Pero si miras el código fuente, te darás cuenta de que nada puede ser null en los métodos que necesitas sobrescribir. Así que puedes deshacerte de todas las interrogaciones, y evitar chequeos de nulos innecesarios.

Conclusión

Los NullPointerException son un horror para cualquier desarrollador en Java, y seguramente representen la mayor parte de los errores que se producen en tu código.

Reducir su número en Kotlin hasta casi cero es muy sencillo, incluso cuando se trabajar con librerías y frameworks en Java.

Sólo esto te evitará horas y horas de depuraciones innecesarias, además de que hará el código mucho más estable.

Si quieres aprender mucho más sobre todo esto y coger la soltura suficiente para crear tus propias Apps Android, te recomiendo que le eches un vistazo al curso presencial que estoy preparando, y del que ya puedes reservar tu plaza.