Odpowiedzi:
Jest to niebezpieczna T?konwersja typu ( ) dopuszczająca wartość null na typ ( T), !!która nie dopuszcza wartości null ,
zostanie zgłoszona, NullPointerExceptionjeśli wartość to null.
Jest to udokumentowane tutaj wraz ze środkami bezpieczeństwa zerowego Kotlin.
sale.latestmoże zawierać null; przypisanie powiedzie się tylko wtedy, gdy sale.latestnie jest zerowe, aw przeciwnym razie spowoduje zgłoszenie NPE. Daje to bezpieczeństwo null dla val price: jego typ będzie różny od null. Zobacz kotlinlang.org/docs/reference/null-safety.html
!!możesz szybko zawieść i zlokalizować główną przyczynę NPE. Chciałbym, żeby Java miała podobną funkcję (to znaczy bez brzydkich ifinstrukcji i / lub assertjonów).
Oto przykład, aby wszystko było jaśniejsze. Powiedz, że masz tę funkcję
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
Spowoduje to następujący błąd kompilacji.
Null can not be a value of a non-null type String
Teraz możesz temu zapobiec, dodając znak zapytania do Stringtypu, aby nadać mu wartość null.
Więc mamy
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
Daje to wynik
null
Teraz, jeśli chcemy, aby funkcja rzucała wyjątek, gdy wartość wiadomości e-mail jest zerowa, możemy dodać dwa wykrzykniki na końcu wiadomości. Lubię to
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Spowoduje to rzucenie KotlinNullPointerException
Operator podwójnego huku to doskonała opcja dla fanów NullPointerException(w skrócie NPE).
Operatora stwierdzenie nie-zerowy
!!przekształca każdą wartość do rodzaju nie zerowym i zgłasza wyjątek, że wartość ta jest zerowa.
val nonNull = a!!.length
Możesz więc pisać a!!, a to zwróci niezerową wartość a( Stringna przykład a tutaj) lub wyrzuci NPE, jeśli ajest null.
Jeśli chcesz NPE, możesz go mieć, ale musisz o to wyraźnie poprosić. Ten operator powinien być używany w przypadkach, gdy programista gwarantuje - wartość nigdy nie będzie zerowa .
!!znajduje się na końcu oświadczenia? IJ auto-convert to Kotlin zrobił to za mnieval price = sale.latest!!