DEV Community

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

Posted on

5 2

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

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more