Asserção de não nulo
Parte da seção Fundamentos do Journey de Kotlin da Coddy. Lição 17 de 93.
O operador de chamada segura e o operador Elvis lidam com valores nulos de forma elegante, mas às vezes você tem absoluta certeza de que um valor anulável não é nulo em um ponto específico do seu código. O operador de asserção de não nulo !! permite dizer ao Kotlin: "Eu garanto que isto não é nulo."
fun main() {
val name: String? = "Alice"
val length = name!!.length // Converte String? para String
println(length) // Imprime: 5
}O operador !! converte um tipo anulável em seu equivalente não anulável. No entanto, se o valor for realmente nulo, seu programa falhará com uma NullPointerException:
fun main() {
val name: String? = null
val length = name!!.length // Trava aqui!
}Quando usá-lo: Use !! somente quando você tiver uma lógica que garanta que o valor não pode ser nulo, mas o compilador não consiga verificar isso. Na maioria dos casos, prefira chamadas seguras ?. ou o operador Elvis ?:. A asserção de não nulo deve ser seu último recurso, não sua primeira escolha.
Desafio
FácilEscreva uma função getUppercaseLength que receba um parâmetro text e retorne o comprimento da sua versão em maiúsculas.
A função recebe um valor de string não nulo, mas o tipo do parâmetro permite nulo (String?). Use o operador de asserção de não nulo !! para convertê-lo em um tipo que não permite nulo; em seguida, encadeie o método uppercase() e obtenha o length.
Parâmetros:
text(String?): Uma string que permite nulo e que tem garantia de conter um valor
Retorna: O comprimento da versão em maiúsculas do texto (Int)
Observação: para este desafio, a entrada será sempre uma string válida, nunca
null. Isso simula um cenário em que você sabe que o valor existe, mas o compilador não consegue verificar isso.
Experimente você mesmo
fun getUppercaseLength(text: String?): Int {
// Escreva o código aqui
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
4Operadores – Parte 1
Operadores aritméticosOperador móduloAtribuição aumentadaOperadores de comparaçãoRecapitulação – Matemática simples7Entrada e Saída Básicas
Função PrintlnTemplates de StringEntrada com ReadLineConversão de TiposRevisão - Anos até a AposentadoriaRevisão - Verdadeiro ou Falso10Funções
Declare uma funçãoParâmetros e argumentosValores de retornoArgumentos nomeadosValores padrãoFunções de expressão únicaRecapitulação — função SigmaRecapitulação — função de validação2Variáveis
Val vs VarInferência de TiposNúmerosStringBooleanoConvenções de NomenclaturaRecapitulação - Inicializar Variáveis5Operadores – Parte 2
Operadores lógicos – Parte 1Operadores lógicos – Parte 2Operadores lógicos – Parte 3Ternário com expressão ifRecapitulação – Lógica simples8Calculadora de Divisão da Conta
Mensagem de Boas-vindasObtendo a Entrada11FizzBuzz com uma Reviravolta
Visão Geral do JogoA Função FizzBuzz3Nullabilidade
O que é Null SafetyTipos anuláveisOperador de chamada seguraOperador ElvisNoções básicas do desafio de funçõesAsserção de não nuloRecapitulação - Acesso seguro6Tomada de Decisões
Instrução IfIf - ElseIf como ExpressãoExpressão WhenWhen com IntervalosRecapitulação - Calculadora Simples9Laços de Repetição
Laço ForLaço WhileLaço Do-WhileBreakContinueIntervalos em LaçosLaço AninhadoRecapitulação - FatorialRecapitulação - Entrada Dinâmica12Fundamentos de Listas
List vs MutableListAcessando ElementosModificando ListasMétodos de ListaPair e TripleRecapitulação - Lista de ProdutosRecapitulação - Lista Invertida15Rastreador de Despesas Diárias
Visão Geral do ProjetoSair do ProgramaPratique por conta própria: Playground de Kotlin