Ответы:
Это небезопасное T?
преобразование типа null ( ) в ненулевой тип ( T
), которое
!!
будет выдано, NullPointerException
если значение равно null
.
Это задокументировано здесь вместе со средствами нулевой безопасности Kotlin.
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
Теперь, если мы хотим, чтобы функция генерировала исключение, когда значение email равно нулю, мы можем добавить два восклицания в конце письма. Как это
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Это бросит KotlinNullPointerException
Оператор Double-Bang - отличный вариант для поклонников NullPointerException
(или NPE для краткости).
Оператор утверждения not-null
!!
преобразует любое значение в ненулевой тип и выдает исключение, если значение равно null.
val nonNull = a!!.length
Таким образом, вы можете написать a!!
, и это вернет ненулевое значение a
( String
например, здесь) или выбросит NPE, если a
равно нулю.
Если вы хотите NPE, вы можете получить его, но вы должны явно запросить его. Этот оператор следует использовать в тех случаях, когда разработчик гарантирует - значение никогда не будет нулевым .
!!
в конце утверждения? IJval price = sale.latest!!