Apa itu operator double-bang Kotlin (!!)?

177

Saya mengonversi Java ke Kotlin dengan Android Studio. Saya mendapatkan double bang setelah variabel instan. Apa double bang dan yang lebih penting di mana ini didokumentasikan?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
mbr_at_ml
sumber

Jawaban:

205

Ini adalah T?konversi tipe nullable ( ) yang tidak aman ke tipe non-nullable ( T), !!akan muncul NullPointerExceptionjika nilainya null.

Hal ini didokumentasikan di sini bersama dengan sarana keamanan tanpa batas dari Kotlin.

hotkey
sumber
1
apa artinya ketika !!di akhir pernyataan? IJ auto-convert ke Kotlin melakukan itu untuk sayaval price = sale.latest!!
ycomp
7
@comp, itu artinya sale.latestbisa mengandung null; penugasan akan berhasil hanya jika sale.latestbukan nol dan akan melemparkan NPE sebaliknya. Ini memberikan keamanan nol untuk val price: tipenya akan non-null. Lihat kotlinlang.org/docs/reference/null-safety.html
hotkey
1
@ hotkey: Jadi apa perbedaan antara mendapatkan NPE - di sini ATAU ketika metode terbaru diakses pada objek nol?
Aada
2
@ Aada, itu masalah umum untuk men-debug NPE dan kesulitan menemukan garis / jalur eksekusi yang menetapkan nilai menjadi nol. Tugas nol ini dapat terjadi pada konteks, kelas atau bahkan hari yang berbeda! Dengan menggunakan !!Anda dapat gagal-cepat dan menemukan akar penyebab NPE. Saya berharap Java memiliki fitur serupa (yaitu, w / o jelekif pernyataan dan / atau assertion buruk).
Cascader
82

Berikut ini adalah contoh untuk membuat semuanya menjadi lebih jelas. Katakanlah Anda memiliki fungsi ini

fun main(args: Array<String>) {
    var email: String
    email = null
    println(email)
}

Ini akan menghasilkan kesalahan kompilasi berikut.

Null can not be a value of a non-null type String

Sekarang Anda dapat mencegahnya dengan menambahkan tanda tanya ke Stringjenis untuk membuatnya nullable.

Jadi kita punya

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email)
}

Ini menghasilkan hasil

null

Sekarang jika kita ingin fungsi untuk melempar pengecualian ketika nilai email adalah nol, kita dapat menambahkan dua tanda seru di akhir email. Seperti ini

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email!!)
}

Ini akan melempar KotlinNullPointerException

Alf Moh
sumber
5
Jadi, mengapa orang menggunakan '!!' meskipun tidak aman karena aplikasi akan dihentikan ketika variabel itu nol?
Sam
3
@david, Anda hanya dapat menggunakannya saat Anda 100% yakin bahwa variabelnya bukan nol (mis. Anda memeriksanya secara eksplisit) dan Anda perlu variabel yang tidak dapat dibatalkan
FMK
7
@ FMK saya mengerti, terima kasih! Saya mengerti bahwa double bang digunakan untuk memungkinkan nilai-nilai variabel tipe nullable untuk masuk ke variabel tipe non-nullable, kan?
Sam
2
@ Jelas ya, tepatnya.
FMK
10

Operator double-bang adalah pilihan yang sangat baik untuk penggemar NullPointerException(atau singkatnya NPE).

The Operator pernyataan tidak-nol !! mengkonversi nilai apapun ke jenis non-null dan melempar pengecualian jika nilai adalah nol.

val nonNull = a!!.length

Jadi Anda dapat menulis a!!, dan ini akan mengembalikan nilai bukan nol dari a(di Stringsini misalnya) atau melempar NPE jika anol.

Jika Anda menginginkan NPE, Anda dapat memilikinya, tetapi Anda harus memintanya secara eksplisit. Operator ini harus digunakan dalam kasus di mana pengembang menjamin - nilainya tidak akan pernah menjadi nol .

Andy Fedoroff
sumber
2
Bertanya sebagai pemula: mengapa saya ingin mengonversi nilai apa pun ke jenis yang bukan nol?
Wolf359
4
@ Wolf359 Memungkinkan Anda untuk menjadi 100% yakin bahwa nilainya tidak nol. ("ini masalah umum untuk men-debug NPE dan kesulitan menemukan garis / jalur eksekusi yang menetapkan nilai menjadi nol. Penugasan nol ini dapat terjadi pada konteks, kelas, atau bahkan hari yang berbeda!" oleh Cascader)
mengurangi aktivitas