Подтвердить что ты не робот

Что такое оператор двойного взрыва (!!) Kotlin?

Я конвертирую Java в Kotlin с Android Studio. Я получаю двойной взрыв после переменной экземпляра. Что такое двойной взрыв и, что еще важнее, где это документировано?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
4b9b3361

Ответ 1

Это небезопасное преобразование типа nullable (T?) в тип, не содержащий NULL (T). Он будет бросать NullPointerException, если значение null.

Здесь документировано вместе с защитными средствами Kotlin.

Ответ 2

Вот пример, чтобы прояснить ситуацию. Скажем, у вас есть эта функция

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

Ответ 3

Это хороший вариант для любителей NullPointerException (или NPE для краткости): оператор ненулевого утверждения !! преобразует любое значение в ненулевой тип и выдает исключение, если значение равно нулю.

val nonNull = a!!.length

Таким образом, вы можете написать a!!, и это вернет ненулевое значение a (например, String здесь) или бросить NPE, если a не имеет значения.

Если вы хотите NPE, вы можете иметь его, но вы должны явно запросить его. Этот оператор следует использовать в тех случаях, когда разработчик дает гарантию - значение никогда не будет нулевым.

Ответ 4

Законен следующий абсурд: var postTruth: String = null !!