DEV Community

Cover image for Null Safety - Kotlin
jocimar-dev
jocimar-dev

Posted on

Null Safety - Kotlin

Um dos contratempos mais comuns em muitas linguagens de programação, como o Java, é que acessar um membro de uma referência nula resultará em uma exceção de referência nula. Em Java, isso seria o equivalente a um NullPointerException ou NPE para abreviar.
O sistema de tipos do Kotlin visa eliminar NullPointerException do nosso código.

Kotlin fornece operadores Safe call(?.) , Elvis(?:), Not-null assertion(!!) para trabalhar em tipos anuláveis.

Safe Call(?.)
Você pode usar o operador de chamada segura (?.) se não quiser lançar uma NullPointerException ao tentar acessar a referência anulável "safeCall"

val safeCall: String? = null
println(safeCall?.length)
Enter fullscreen mode Exit fullscreen mode
  • Retorna null se for anulável e não lançará NullPointerException

Elvis Operator(?:)
Quando temos uma referência anulável da variável "valor", podemos dizer “se 'valor' não for nulo, use-o, caso contrário, use algum valor não nulo”:

val valor: Int =
    if (valorVariavel != null) valorVariavel.length
    else -1
Enter fullscreen mode Exit fullscreen mode

O código acima pode ser expresso com o Elvis Operator, escrito ?:

valorVariavel?.length ?: -1

Enter fullscreen mode Exit fullscreen mode

Se a expressão à esquerda de ?: não for nula, o Elvis Operator a retorna, caso contrário, retorna a expressão à direita. Observe que a expressão do lado direito é avaliada somente se o lado esquerdo for nulo

Outro exemplo:

fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
    val name = node.getName() ?: throw IllegalArgumentException("Exceção lançada")

    parent.getParent()?.getName()?.length

    return name
}
Enter fullscreen mode Exit fullscreen mode

Not-null assertion operator(!!)
No caso abaixo, se a variável "pergunta" for nula, ocorrerá através da exceção de ponteiro nulo. Você pode usar (!!) se quiser lançar explicitamente uma exceção se o tipo for anulável.

val pergunta: String? = null
pergunta!!.toInt()
Enter fullscreen mode Exit fullscreen mode

Top comments (0)