Operador !! em Kotlin: o que é e como não quebrar o código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Kotlin, nulos e o ponto de exclamação duplo: introdução

\n\n

Você já escreveu em Kotlin, o compilador reclamou de um potencial null, e você respondeu colocando dois pontos de exclamação — !! — e seguiu em frente? Se sim, você já conhece o herói do nosso artigo — o operador double bang (também conhecido como operador !! em Kotlin).

\n\n

Este símbolo é ao mesmo tempo um salvador e uma ferramenta perigosa. Ele diz ao compilador: "Cale a boca, eu sei o que estou fazendo, esta variável definitivamente não é null". Mas se você estiver errado — o aplicativo cairá com um NullPointerException. Parece assustador? Na verdade, é apenas um mecanismo poderoso que você precisa entender e usar com sabedoria.

\n\n

Neste guia, vamos explorar o que é double bang Kotlin, como ele funciona, onde usá-lo e onde é melhor procurar alternativas. Você aprenderá como não dar um tiro no próprio pé e escrever código confiável.

\n\n

O problema que o !! resolve: Null Safety em Kotlin

\n\n

Kotlin foi criado como uma linguagem que deveria matar o NullPointerException (NPE). E ele quase conseguiu. Em Kotlin, os tipos por padrão não podem ser null. Você simplesmente não pode atribuir null a uma variável do tipo String — o compilador não permite.

\n\n
var name: String = "Alice"\nname = null // Erro de compilação!\n
\n\n

Mas o mundo real é cheio de incertezas. Os dados vêm do banco de dados, do usuário, da rede. Por isso, Kotlin introduziu tipos nullable — tipos que podem ser null. Eles são indicados por um ponto de interrogação: String?.

\n\n
var nullableName: String? = "Bob"\nnullableName = null // Agora é permitido\n
\n\n

E aqui começa a mágica. Você não pode simplesmente chamar um método em uma variável nullable:

\n\n
val length = nullableName.length // Erro! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n
\n\n

Kotlin força você a lidar com null. Isso é genial — você não esquece de verificar. Mas às vezes você sabe com certeza que o valor não é null. E é aí que entra em cena o operador de ponto de exclamação duplo Kotlin.

\n\n

O que é o operador !! (double bang)?

\n\n

O operador !! em Kotlin é o operador de afirmação forçada non-null. Ele pega um valor nullable e o converte em um tipo non-null. Se o valor for null — é lançado um KotlinNullPointerException.

\n\n

Sintaticamente, ele aparece como dois pontos de exclamação após a variável:

\n\n
val nonNullValue = nullableValue!!
\n\n

Como funciona na prática

\n\n

Imagine que você tem uma função que busca um usuário por ID. Ela retorna User?, porque o usuário pode não existir. Mas você sabe com certeza que no seu ambiente de teste o usuário com ID = 1 existe.

\n\n
data class User(val name: String)\n\nfun findUser(id: Int): User? {\n    // Alguma lógica de busca\n    return if (id == 1) User("Ana") else null\n}\n\nfun main() {\n    val user = findUser(1)\n    // Temos certeza que user não é null\n    val userName = user!!.name\n    println(userName) // Imprime: Ana\n}\n
\n\n

Neste exemplo, o double bang Kotlin funcionou corretamente e obtivemos o nome. Mas se o ID fosse 2, o aplicativo cairia com uma exceção.

\n\n

Quando usar !! (e quando é categoricamente proibido)

\n\n

O operador !! (double bang) é como um botão vermelho. Você pode apertá-lo, mas apenas se tiver 146% de certeza. Vamos analisar os cenários legítimos.

\n\n

Quando pode (e deve) usar !!

\n\n
    \n
  1. Interação com código Java. Java não conhece anotações nullable. Se um método Java retorna um objeto, Kotlin o vê como um Platform Type (por exemplo, String!). Você pode tratá-lo como quiser. Mas e

Blogs

Book Recommendations