Kotlin implementa il lavoro sicuro con null grazie a un sistema di tipi: qualsiasi tipo per impostazione predefinita non può essere null, ad esempio, val a: String = null genererà un errore di compilazione. Per indicare la possibilità di assegnare null si utilizza il simbolo di domanda ?, ad esempio:
val name: String? = null
Per lavorare con i tipi Nullable sono disponibili:
?., che restituisce null se l'oggetto stesso è null, e chiama il metodo/campo nel caso contrario: name?.length.?:, per impostare un valore predefinito se a sinistra c'è null: val length = name?.length ?: 0if (name != null) { println(name.length) }
NullPointerException se l'oggetto è null (usato con molta cautela):val length = name!!.length
Migliori pratiche: ridurre al minimo i tipi Nullable, utilizzare l'operatore di chiamata sicura e l'operatore di Elvis, evitare !!, modellare esplicitamente le situazioni in cui null è consentito.
È possibile assegnare al tipo
val a: Stringun valore null, e come evitarlo?
Risposta: No, per impostazione predefinita in Kotlin i tipi non possono essere uguali a null. Per consentire l'assegnazione di null, è necessario specificare esplicitamente val a: String? = null. I tipi senza ? sono sempre non-null.
Storia
Nel progetto di un'applicazione bancaria, una variabile di tipo
Usermemorizzava il risultato della ricerca di un cliente. Lo sviluppatore ha definitovar user: User, ma a volte il cliente non veniva trovato e il servizio restituiva null. Ciò generava NPE e crash massivi.
Storia
In un chatbot di supporto si usava !! per accedere ai messaggi dell'utente (
message!!.text), pensando che i messaggi arrivassero sempre. Il bot è crollato al primo messaggio vuoto. La chiamata sicura avrebbe evitato il problema.
Storia
Nell'app mobile, i dati dal database potevano non essere stati caricati e arrivavano come null. Invece di un accesso sicuro, lo sviluppatore ha utilizzato accesso diretto, causando crash in tutti i casi di dati incompleti.