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.