Відповіді:
Це небезпечне 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!!