Kotlin çift patlama (!!) operatörü nedir?


178

Android Studio ile Java'yı Kotlin'e dönüştürüyorum. Örnek değişkeninden sonra çift patlama alıyorum. Çift patlama nedir ve daha da önemlisi bu nerede belgelenir?

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

Yanıtlar:


206

Bu güvenli null tipi (bir T?non-null türü () dönüştürme T), !!atmak NullPointerExceptiondeğeri ise null.

Bu belgelenmiştir burada boş-emniyet Kotlin araçlarla birlikte.


1
!!bir ifadenin sonunda olduğunda ne anlama gelir ? val price = sale.latest!!
Kot

7
@ycomp, sale.latestiçerebileceği anlamına gelir null; atama yalnızca sale.latestboş değilse başarılı olur ve aksi takdirde NPE'yi atar. Bu null güvenlik sağlar val price: türü null olmaz. Bkz. Kotlinlang.org/docs/reference/null-safety.html
kısayol tuşu

1
@hotkey: Peki, NPE alma ile burada VEYA null nesnede en son yönteme erişildiğinde arasındaki fark nedir?
Aada

3
@Aada, bir NPE'de hata ayıklamak ve değeri null olarak ayarlayan satırı / yürütme yolunu bulmakta zorlanır. Bu null ödev farklı bir bağlamda, sınıfta ve hatta günde gerçekleşebilir! Kullanarak !!başarısız olabilir ve bir NPE'nin temel nedenini bulabilirsiniz. Keşke Java benzer bir özelliği (yani, çirkin ififadeler ve / veya assertiyonlar olmadan) olsaydı .
Cascader

82

İşte işleri daha net hale getirmek için bir örnek. Diyelim ki bu işleve sahipsin

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

Bu aşağıdaki derleme hatası verecektir.

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

Şimdi, Stringtürü null edilebilir hale getirmek için bir soru işareti ekleyerek bunu önleyebilirsiniz .

Böylece sahibiz

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

Bunun sonucu

null

E-posta değeri null olduğunda işlevin bir istisna atmasını istiyorsak, e-postanın sonuna iki ünlem ekleyebiliriz. Bunun gibi

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

Bu bir KotlinNullPointerException


5
Peki, neden insanlar '!!' güvensiz olmasına rağmen, bu değişken null olduğunda bir uygulama sonlandırılacak mı?
Sam

3
@david, yalnızca değişkenin boş olmadığından% 100 emin olduğunuzda kullanabilirsiniz (örn. açıkça kontrol ettiniz) ve null edilemeyen değişkene ihtiyacınız var
FMK

7
@FMK Anladım, teşekkürler! Ben çift patlama nullable tip değişkeninin değerlerinin nullable tip değişkenine girmesini mümkün kılmak için kullanıldığını anlıyorum, değil mi?
Sam

2
@david evet, kesinlikle.
FMK

10

Çift patlama operatörü , NullPointerException(veya kısaca NPE) hayranları için mükemmel bir seçenektir .

Olmayan boş onaylama işlemi operatör !! bir herhangi bir değer dönüştürür boş olmayan Çeşidi ve değer boş ise, bir durum oluşturur.

val nonNull = a!!.length

Böylece yazabilirsiniz a!!ve bu null olmayan bir değer a( Stringörneğin burada) döndürür veya anull ise bir NPE atar .

Bir NPE istiyorsanız, buna sahip olabilirsiniz, ancak açıkça istemeniz gerekir. Bu operatör, geliştiricinin garanti ettiği durumlarda kullanılmalıdır - değer asla boş olmaz .


2
Acemi olarak sorma: Neden herhangi bir değeri null olmayan bir türe dönüştürmek isteyeyim?
Wolf359

4
@ Wolf359 Değerinin boş olmadığından% 100 emin olmanızı sağlar. ("bir NPE'de hata ayıklamak ve değeri null olarak ayarlayan satır / yürütme yolunu bulmakta zorlanır. Bu null atama, farklı bir bağlamda, sınıfta veya hatta günde gerçekleşebilir!"
etkinliğin azaltılması
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.