По умолчанию Kotlin избегает значений null
, а для Null Safety
он предоставляет:
1) Безопасный оператор вызова (?. *
2) Не пустое утверждение (!!)
3) Elvis Opeartor (?:)
4) Безопасный вызов с let (? .Let {...})
Безопасный вызовОператор (?.) : проверяет, не является ли свойство нулевым, перед выполнением каких-либо операций.
Утверждение, не являющееся нулевым (!!) : явно указываеткомпилятору, что свойство не является нулевым, и если оно является нулевым, пожалуйста, сгенерируйте исключение нулевого указателя (NPE)
Elvis Opeartor (?:) : Это похоже на троицуоператор в Java.Если свойство не равно NULL, то левое выражение возвращается в противном случае вправо.
Безопасный вызов с let (? .Let {...}) : он выполнитблокировать блокировку, только если свойство не равно нулю
Пример (с недопустимым значением внутри свойства):
fun main() {
val name: String? = "Sumit"
println("Safe Call operator: ${name?.length}")
name?.let {
println("Safe Call wih let operator: ${name.length}")
}
val length = name?.length ?: 0
println("Elvis operator : $length")
println("Not Null Assertion Operator : ${name!!.length}")
}
Вывод(С ненулевым значением внутри свойства)
Оператор безопасного вызова: 5
Безопасный вызов с оператором let: 5
Оператор Элвиса: 5
Оператор ненулевого подтверждения: 5
Вывод (с нулевым значением внутри свойства) (val name: String? = Null)
Safe Call operator: null
Elvis operator : 0
Exception in thread "main" kotlin.KotlinNullPointerException
at HelloKt.main(Hello.kt:14)
at HelloKt.main(Hello.kt)
Здесь безопасный вызов с let не выполняется !!А оператор утверждения Not-Null генерирует исключение нулевого указателя.
Ваша проблема может использовать оператор утверждения не-NULL:
A?.B?.let {
// If A and B are not null then only this block will be executed.
A.someMethod()
B.someMethod()
}