Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Valores nulos, Double bang y cómo solucionarlos.

18/37
Recursos

Aportes 12

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Excelente clase como todas las anteriores. Para quien quiera, recomiendo la siguiente lectura:

https://programandoointentandolo.com/2018/02/kotlin-gestion-nulos-null-safety.html

HomeKotlinKotlin, Gestión de nulos (Null Safety)
KOTLIN, GESTIÓN DE NULOS (NULL SAFETY)
kotlin null safety
En Kotlin los objetos por defecto no aceptan valores nulos, para que le podamos asignar un null tendremos que indicar que ese objeto realmente puede ser null. De esta forma vamos a poder garantizar que no se no producirá un NullPointerException en tiempo de ejecución sin necesidad de llenar todo el código de comprobaciones if (a != null) o if (b == null) cuando las variables no deban ser null en ningún caso, pero también nos da una vía de escape para que podamos tener los queridos NullPointerException.

NULL SAFETY, NO MÁS NULLPOINTEREXCEPTION
Kotlin es Null Safety, es decir, que gestiona los nulos de forma segura, de modo que puedes garantizar que tu código no va a producir NullPointerException.

Para empezar por defecto los objetos en Kotlin por defecto son not-null y si intentamos asignarle un null a una variable directamente no va a compilar.

var nombre: String
nombre = null 
// Null can not be a value of a non-null type String
Sin null todo es muy bonito pero está claro que muchas veces si queremos que los objetos sí que sean nullables, para esto tenemos que añadir ? después del nombre del tipo.


var nombre: String?
nombre = null


var longitud: Int = nombre.length 
// Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?

Y seguimos buscandole las cosquillas a Kotlin para que nos dé un NullPointerException intentando sacar la longitud de la cadena cuando es null, pero no nos deja porque no compila y nos dice que tenemos 2 opciones ?. si queremos hacerlo de forma segura o !!. si no queremos que el compilador compruebe si puede ser null.

DESACTIVAR COMPROBACIÓN DE NULOS
Si optamos por !!. hacemos que el compilador no compruebe si puede ser null y por lo tanto compilará sin problemas, eso si el resultado de la ejecución no será demasiado bueno… No se me ocurre ningún motivo para utilizarlo, pero bueno hay esta por si echamos de menos los null pointers…

var nombre: String? = null
var longitud: Int = nombre!!.length 
// Exception in thread "main" kotlin.KotlinNullPointerException

LLAMADAS SEGURAS
Lo lógico será que usemos ?. para que no falle. Si como en nuestro ejemplo el objeto es null cuando se intente sacar la longitud del nombre en lugar de lanzarse una excepción lo que sucederá es que devolverá null y por lo tanto nuestra variable longitud tiene que ser nullable para que compile correctamente. Si ejecutemos este código longitud es null.

var nombre: String? = null
// var longitud: Int = nombre?.length // Type mismatch: inferred type is Int? but Int was expected
var longitud: Int? = nombre?.length
println("Longitud: ${longitud}")
// Longitud: null

EL OPERADOR ELVIS ( ?: )
Si solo usamos ?. siempre vamos a poder recibir un null y por lo tanto estamos propagando a los siguientes objetos o funciones la necesidad de soportar nulos, pero puede que no sea lo que queramos. Para evitar esto podemos usar el operador Elvis ?: que nos permite definir un valor alternativo si se encuentra un null, por ejemplo para la longitud podríamos usar 0.

var nombre: String? = null
var longitud: Int = nombre?.length ?: 0
println("Longitud: ${longitud}")
// Longitud: 0

SACAR LOS VALORES DISTINTOS DE NULL DE UNA LISTA
Si tenemos una lista (o cualquier otro tipo de Collection) que tenga valores nulos, podemos filtrarlos fácilmente con la función .filterNotNull() para obtener solo los valores distintos de null.

val listaConNulls: List = listOf(null, 2, null, 4, null)
println("Con nulls: ${listaConNulls}")
// Con nulls: [null, 2, null, 4, null]

val listaSinnNulls: List = listaConNulls.filterNotNull()
println("Sin nulls: ${listaSinnNulls}")
// Sin nulls: [2, 4]

Y bueno aunque no lo he puesto se puede comprobar si un objeto es null o no utilizando if-else, pero si hay formas más sencillas de hacerlo ¿porque utilizarlos?

fuente: https://programandoointentandolo.com/2018/02/kotlin-gestion-nulos-null-safety.html




Hola estos son algunos de mis apuntes de Kotlin, espero les sirvan 😛
Kotlin

Valores nulos, Double bang y cómo solucionarlos

Para solucionar errores nulleables, le decimos a las variables que declaremos que el valor puede ser null con un signo de interrogación…

var segundoNombre : String? = "Antonio"

Safe Calls

Nos ayuda a ejecutar un código cuando una variable del tipo nulleable no es nula

println(segundoNombre?.length)

Double Bang

Le indicamos al compilador que enn este punto la variable nno puede ser nula

var caracteres: Int = segundoNombre!!.length

Solo usalo cuando estes 100% seguro de que esta variable siempre tendrá un valor diferente a null. Peeeeero trata de evitarlo lo más posible.

Los errores que generan los null son los mas dificiles de corregir ya que solo ocurren en tiempo de ejecucion o en produccion, por lo cual toda validacion y herramienta que te brinde el lenguaje para evitarlo siempre debe ser usada para evitar problemas a largo plazo y hacer el codigo mas legible.

Por fin Kotlin!

Vengo de Java O.O y de Funcional con Java y de String a medias… pero esto puuuuf es la pegada! como que evitamos los null en la app? que demas ame Java… ahora amo a KOtlin

la llamada la length es sin paréntesis

  //safe-calls
    println(segundoNombre?.length)

En kotlin por defecto nigun valor puede ser nulo. Nos marcar un error.
El operador Double Bang se utiliza pocas veces en kotlin y es preferible no usarlo

Llamada segura mediante operador ?.

Kotlin nos ofrece el operador ? de cara a reducir ese código, de modo que podemos tener la comprobación de null y la llamada al método en la misma línea. De este modo, el siguiente código:

nombre?.toUpperCase()  

Es lo mismo que:

if (nombre != null)
     nombre.toUpperCase()
else null 

Cuando declaras una variable de forma predeterminada, su valor no puede ser null.
.
Kotlin nos ayuda a evitar las excepciones, se usa el operador ? para que una variable puede ser una nula.
.
var variable: Int? = null