Ответы:
Это небезопасное 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!!