Відповіді:
Це небезпечне T?перетворення нульового типу ( ) в ненульовий тип ( T),
!!буде кинутим, NullPointerExceptionякщо значення є null.
Це задокументовано тут, поряд із засобами нульової безпеки Котліна.
sale.latestможе містити null; призначення буде успішним лише в тому випадку, якщо sale.latestвоно не є нульовим і в іншому випадку викине NPE. Це дає нульову безпеку для val price: його тип буде ненульовим. Дивіться kotlinlang.org/docs/reference/null-safety.html
!!ви можете швидко вийти з ладу та знайти першопричину NPE. Я хотів би, щоб у Java була подібна особливість (тобто без потворних ifтверджень та / або assertіонів).
Ось приклад, щоб зробити речі зрозумілішими. Скажіть, у вас є ця функція
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
Це призведе до наступної помилки компіляції.
Null can not be a value of a non-null type String
Тепер ви можете запобігти цьому, додавши знак питання до Stringтипу, щоб зробити його незмінним.
Так ми маємо
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
Це дає результат
null
Тепер, якщо ми хочемо, щоб функція видала виняток, коли значення електронної пошти є нульовим, ми можемо додати два вигуки в кінці електронної пошти. Подобається це
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Це кине а KotlinNullPointerException
Оператор подвійного вибуху - відмінний варіант для любителів NullPointerException(або NPE для коротких).
Оператор твердження не-NULL
!!перетворює будь-яке значення до типу ненульового і генерує виняток , якщо значення дорівнює нулю.
val nonNull = a!!.length
Таким чином, ви можете написати a!!, і це поверне ненулеве значення a( Stringнаприклад, тут) або викине NPE, якщо воно aє нульовим.
Якщо ви хочете NPE, ви можете мати його, але ви повинні прямо просити його. Цей оператор слід використовувати в тих випадках, коли розробник гарантує - значення ніколи не буде нульовим .
!!знак знаходиться в кінці заяви? Автоперетворення IJ в Котлін зробив це для менеval price = sale.latest!!