Null safety (Segurança nula)

A segurança nula é um recurso do Kotlin projetado para reduzir significativamente o risco de referências nulas, também conhecido como erro de um bilhão de dólares.

Uma das armadilhas mais comuns em muitas linguagens de programação, incluindo Java, é que acessar um membro de uma referência nula resulta em uma exceção de referência nula. Em Java, isso seria o equivalente a um NullPointerException, ou um NPE para abreviar.

O Kotlin oferece suporte explícito à nulidade como parte de seu sistema de tipos, o que significa que você pode declarar explicitamente quais variáveis ou propriedades podem ser null. Além disso, quando você declara variáveis não nulas, o compilador impõe que essas variáveis não podem conter um valor null, impedindo um NPE.

A segurança nula do Kotlin garante um código mais seguro, detectando possíveis problemas relacionados a nulos em tempo de compilação, em vez de tempo de execução. Esse recurso melhora a robustez, a legibilidade e a capacidade de manutenção do código, expressando explicitamente valores null, tornando o código mais fácil de entender e gerenciar.

As únicas causas possíveis de um NPE em Kotlin são:

  • Uma chamada explícita para throw NullPointerException().
  • O uso do not-null assertion operator !!.
  • Inconsistência de dados durante a inicialização, como quando:
  • Um arquivo não inicializado this disponível em um construtor éeusado em outro lugar.
    • Um construtor de superclasse que chama um membro aberto cuja implementação na classe derivada usa um estado não inicializado.
  • Interoperação Java:
  • Tenta acessar um membro de uma null referência de um tipo de plataforma .
  • Problemas de nulidade com tipos genéricos. Por exemplo, um pedaço de código Java adicionado null em um Kotlin MutableList<String>, o que exigiria MutableList<String?> manipulá-lo corretamente.
  • Outros problemas causados ​​por código Java externo

Além do NPE, outra exceção relacionada à segurança nula é UninitializedPropertyAccessException. O Kotlin lança essa exceção quando você tenta acessar uma propriedade que não foi inicializada, garantindo que propriedades não anuláveis ​​não sejam usadas até que estejam prontas. Isso normalmente acontece com lateinit propriedades.