Nulls are unavoidable, especially if you work with Java libraries or get data from a database.
But you can check for null the Java way:
// Will return "String" half of the time, and null the other half
val stringOrNull: String? = if (Random().nextBoolean()) "String" else null
// Java-way check
if (stringOrNull != null) {
println(stringOrNull.length)
}
Or in a shorter form, with the Elvis operator. If the length is not null, this operator will return its value. Otherwise, it will return the default value we supplied, zero in this case:
val alwaysLength = stringOrNull?.length ?: 0
println(alwaysLength) // Will print 6 or 0, but never null
If you have a nested object, you can chain those checks:
data class Json(
val User: Profile?
)
data class Profile(val firstName: String?,
val lastName: String?)
val json: Json? = Json(Profile(null, null))
println(json?.User?.firstName?.length)
Finally, you can use the let() block for those checks:
println(json?.let {
it.User?.let {
it.firstName?.length
}
})
If you want to get rid of the it() everywhere, you can use run:
println(json?.run {
User?.run {
firstName?.length
}
})
By all means, do try to avoid the unsafe !! null operator:
println(json!!.User!!.firstName!!.length)
This will result in KotlinNullPointerException.