Uno de los problemas que tenemos al momento de desarrollar aplicaciones en muchos de los lenguajes de programación hoy en día como C#, Java y nuestro caso de interés que es desarrollar aplicaciones con Android, es el más que molesto NULLPointerException
de Java o la Excepción a referencias nulas que puede aparecer en nuestra aplicación cuando menos nos lo esperamos; Kotlin ofrece varios métodos muy interesantes para lidiar con esto molesto escenario y con muy poco código y de una manera muy fácil.
En esta entrada veremos cómo manejar los tipos de datos no nulos (que no se les permite ser nulos), los que pueden ser nulos y cómo manejar en lo que sería en Java una excepción de tipo NULLPointerException
en Kotlin.
Tipos no nulos (Non-NULLable types)
Por defecto, los tipos de datos en Kotlin no se les permite ser nulos, que de por sí sería una buena idea ya que el compilador nos avisará si en algún momento establecemos de manera programática (en el código) dicha variables como nulo:
var a: String = "abc"
Si intentamos referenciar un valor nulo
var a: String = "abc"
a = NULL // error de compilador
El compilador nos daría un error; el problema viene ahora si el valor viene de alguna otra fuente como datos de entrada o de un servidor provista de una consulta (en resumen, en tiempo de ejecución), etc que nos pueda dar un valor nulo para esta variable, para estos casos y cuando queremos que nuestra variable pueda ser nula debemos hacer lo explicado en la siguiente sección.
Tipos de datos nulos (NULLable types)
Para permitir los nulos en nuestras variable simplemente debemos emplear el carácter ?
luego de indicar el tipo de dato especificado:
var a: String? = "abc"
a = NULL // el compilador lo permite
Por supuesto,con esto volvemos al problema inicial con las referencias nulas en las propiedades y métodos que podamos emplear en nuestras variables definidas y con esto el problema inicial en un ciclo que no parece tener fin.. o no.
El compilador de Kotlin nos obliga a comprobar si una variable es definida como NULLable
o que pueda ser nula antes de emplear una propiedad o método de la misma; es decir, si tenemos el siguiente fragmento de código:
val x: Int? = NULL
E intentado emplear algún método o propiedad:
val h = x.toDouble()
No compilaría hasta que comprobemos si no es nula:
if (x != NULL) {
val h = x.toDouble()
}
Operadores unarios para los tipos NULLables
Si queremos poder emplear las propiedades y métodos provistos por la API de Kotlin o generados por terceros o nosotros sin tener miedo de que nos de una excepción a una referencia nula en algún momento podemos emplear el carácter ?
delante del nombre de la propiedad método:
var a: String? = "abc"
a = NULL // bien
a?.length // NULL
En el fragmento de código anterior, si lo ejecutamos al momento de a?.length
cuyo valor de la variable a
es nulo, nos da que a?.length
es nulo también, cosa que no sucedería si no empleamos el carácter ?
delante del nombre de la propiedad a acceder (?.length
).
Devolviendo la excepción
Existe otro operador que podamos emplear similar al de ?
empleado anteriormente, y es el operador !!
que al ser nulo la variable consultada nos devolvería una excepción:
var a: String? = "abc"
a = NULL // bien
a!!.length // NULLPointerException
En resumen, el operador ?
nos devolvería nulo al momento de acceder a alguna propiedad o método si la variable si es nula, y el operador !!
nos devolvería una excepción si se accede a alguna propiedad o método de la variable si es nula.
Retornando valores personalizados en variable nulas
Si queremos que nos retorne otro valor que no sea nulo si no algun otro definido por nosotros también podemos hacer lo siguiente cuyo esquema se parece bastante a los condicionales cortos en PHP:
val l = b?.length ?: -1
Ya con esto podemos emplear los tipos de datos en Kotlin sin problemas, si queremos emplear el nuevo esquema de Kotlin que no permite nulos por defectos, o el más común que permite nulos pero con el problema de las referencias nulas, ya sabemos como tratar para evitar las referencias nulas al momento de acceder a las propiedades o métodos; en la siguiente entrada veremos cómo emplear los métodos y clases en kotlin.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter