Translate

domingo, 25 de noviembre de 2018

Luchando contra NullPointerException con Kotlin - parte 2


Esta es la primera parte : https://emanuelpeg.blogspot.com/2018/11/luchando-contra-nullpointerexception.html

Como habíamos dicho Kotlin tienen diferente un montón de operadores para controlar los NullPointerException.

Veamos el operador ?. Un pequeño ejemplo:

val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length)

Esto devuelve b.length si b no es nulo, y nulo de lo contrario, por lo tanto esto retorna un valor de tipo : Int?

Esto es muy practico, ya que nos olvidamos de hacer muchas comprobaciones por ejemplo, si necesito el nombre del profesor del curso que esta haciendo juan :

juan?.curso?.profesor?.nombre

Como no estoy seguro que juan este haciendo un curso y el curso tenga un profesor y el profesor un nombre, uso ?.

Si queremos solo valores no nulos podemos usar let :

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints A and ignores null
}

let realiza la acción si no es nulo.

el operador ?. es útil para la asignación:

person?.department?.head = managersPool.getManager()

Si person o department es nulo no asigna nada.

El operador Elvis nos permite hacer acciones si los campos son nulos, veamos un ejemplo:

 fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
    val name = node.getName() ?: throw IllegalArgumentException("name expected")
    // ...
}

El operador de aserción no-nula (!!) convierte cualquier valor a un tipo que no sea nulo y lanza una excepción si el valor es nulo:

val l = b!!.length

Deberíamos manejar el NullPointerException.

Por ultimo tenemos unos chiches, por ejemplo si un valor es nulo y queremos castear nos va traer problema si este valor es null por lo tanto tenemos el as?

val aInt: Int? = a as? Int

Si tenemos una lista que permite nulos y queremos solo los valores no nulos contemos con filterNotNull :

val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()

Y ya esta, que más queres?

Dejo link:
https://kotlinlang.org/docs/reference/null-safety.html