0Pricing
Kotlin Academy · Aula

O Operador !!

Force um valor não nulo e conheça os riscos

O Operador !! é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

Forçando a não nulidade

Às vezes, você tem certeza de que um valor anulável não é nulo, mas o compilador ainda reclama.

O operador de asserção de não nulo !! instrui o compilador a confiar em você e tratar o valor como não nulo.

Uso básico

Adicionar !! converte um tipo anulável no tipo correspondente não nulo.

Se o valor realmente não for nulo, o código funcionará exatamente como uma chamada normal.

fun main() {
    val name: String? = "Kotlin"
    println(name!!.length)
}

O perigo

Se o valor for realmente null, !! lançará uma NullPointerException exatamente nesse ponto.

Esse é o único lugar em que o Kotlin permite que um NPE aconteça, e a responsabilidade é inteiramente sua.

fun main() {
    val name: String? = null
    try {
        println(name!!.length)
    } catch (e: NullPointerException) {
        println("Boom: NullPointerException")
    }
}

Por que ele existe

O operador é intencionalmente desagradável. Dois pontos de exclamação se destacam na revisão do código, sinalizando um local em que você ignorou a rede de segurança.

Ele existe para os casos raros em que você realmente sabe mais do que o compilador.

A chamada segura geralmente é melhor

Na maioria das situações, uma chamada segura ?. com Elvis ?: é mais segura e igualmente curta.

Compare abaixo as duas abordagens para o mesmo objetivo.

fun main() {
    val name: String? = null
    val safeLength = name?.length ?: 0
    println(safeLength)
}

Evite encadear !!

Nunca encadeie vários !!, como em a!!.b!!.c. Se isso causar uma falha, você não poderá saber qual parte era nula.

Separe a expressão ou use chamadas seguras.

fun main() {
    val text: String? = "hi"
    // bad style: text!!.uppercase()!! is hard to debug
    val good = text?.uppercase() ?: ""
    println(good)
}

Um uso legítimo

Um caso aceitável: um valor que você definiu anteriormente e sabe que já foi inicializado.

Mesmo assim, prefira lateinit ou reestruture o código quando possível.

fun main() {
    var config: String? = null
    config = "loaded"
    // we just assigned it, so !! is safe here
    println(config!!.uppercase())
}

Lendo o rastreamento da pilha

Quando !! falha, a exceção aponta para a linha exata. Essa precisão é a única vantagem em comparação com um resultado incorreto silencioso.

Use a mensagem para encontrar e corrigir a suposição que estava errada.

fun length(text: String?): Int {
    return text!!.length
}

fun main() {
    println(length("abc"))
    // length(null) would throw on the !! line
}

Refatorando para remover !!

A maioria dos usos de !! pode ser removida tratando nulos corretamente. Abaixo, um valor alternativo com Elvis torna a função total e livre de falhas.

fun length(text: String?): Int {
    return text?.length ?: 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

Regra prática

Trate cada !! como uma pergunta: tenho certeza absoluta de que isso nunca será nulo?

  • Se sim e for raro → aceitável
  • Se não tiver certeza → use ?. e ?:

Reunindo tudo

O operador !! é uma ferramenta perigosa:

  • Ele força um valor anulável a assumir um tipo não nulo
  • Ele lança uma NullPointerException se o valor for nulo
  • Prefira chamadas seguras e Elvis em quase todos os casos
fun main() {
    val sure: String? = "definitely here"
    println(sure!!.length)
    val maybe: String? = null
    println(maybe?.length ?: -1)
}

Verificação rápida

Teste sua compreensão sobre o operador de asserção de não nulo.

Recapitulação

Você aprendeu sobre o operador !!:

  • Ele afirma que um valor anulável não é nulo
  • Ele lança uma NullPointerException quando essa afirmação está errada
  • Deve ser o último recurso, não um hábito

A seguir, você verá como a nulidade chega do Java por meio dos tipos de plataforma.

Perguntas Frequentes

A aula “O Operador !!” é grátis?

Sim — o texto completo de “O Operador !!” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “O Operador !!”?

Force um valor não nulo e conheça os riscos Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “O Operador !!”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Tipos Nulos e Não Nulos
  2. Chamadas Seguras e Elvis
  3. O Operador !!
  4. Tipos de Plataforma
← Voltar para Kotlin Academy