कोटलिन डबल-बैंग (!!) ऑपरेटर क्या है?


177

मैं एंड्रॉइड स्टूडियो के साथ जावा को कोटलिन में परिवर्तित कर रहा हूं। उदाहरण चर के बाद मुझे डबल धमाका मिलता है। डबल बैंग क्या है और इससे भी महत्वपूर्ण बात यह है कि यह दस्तावेज कहां है?

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

जवाबों:


205

यह असुरक्षित अशक्त प्रकार ( T?) एक गैर- अशक्त प्रकार ( ) में रूपांतरण है T, मान होने पर !!फेंक देगा ।NullPointerExceptionnull

इसे यहां कोटलिन-सुरक्षा के कोटलिन माध्यमों के साथ प्रलेखित किया गया है


1
जब !!एक बयान के अंत में यह क्या मतलब है? IJ ऑटो-कन्वर्ट val price = sale.latest!!
कोटलिन

7
@ycomp, इसका मतलब है कि sale.latestइसमें शामिल हो सकते हैं null; असाइनमेंट तभी सफल होगा जब sale.latestवह अशक्त न हो और अन्यथा एनपीई को फेंक देगा। यह अशक्त-सुरक्षा देता है val price: इसका प्रकार गैर-अशक्त होगा। देखें kotlinlang.org/docs/reference/null-safety.html
हॉटकी

1
@hotkey: तो NPE प्राप्त करने में क्या अंतर है - यहाँ या जब नवीनतम विधि को null ऑब्जेक्ट पर एक्सेस किया जाता है?
आरा

2
@ अडा, एक एनपीई को डिबग करने के लिए यह आम समस्या है और एक कठिन समय है जो लाइन / एक्ज़ेक्युशन पथ का पता लगाता है जो मान को अशक्त करता है। यह अशक्त असाइनमेंट एक अलग संदर्भ, वर्ग या दिन पर भी हो सकता है! उपयोग करने से !!आप तेजी से विफल हो सकते हैं और एनपीई के मूल कारण का पता लगा सकते हैं। काश जावा में भी ऐसी ही विशेषता होती (यानी w / o बदसूरत ifबयान और / या assertआयन)।
कैसकेर

82

यहां चीजों को स्पष्ट करने के लिए एक उदाहरण दिया गया है। कहते हैं कि आपका यह कार्य है

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

अब अगर हम चाहते हैं कि ईमेल के मूल्य शून्य होने पर फ़ंक्शन अपवाद को छोड़ दे, तो हम ईमेल के अंत में दो विस्मयादिबोधक जोड़ सकते हैं। ऐशे ही

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

यह एक फेंक देगा KotlinNullPointerException


5
तो, लोग 'क्यों' का उपयोग करेंगे? हालांकि यह असुरक्षित है क्योंकि किसी एप्लिकेशन को उस वेरिएबल के शून्य होने पर समाप्त कर दिया जाएगा?
सैम

3
@ आप इसे केवल तभी उपयोग कर सकते हैं जब आप 100% सुनिश्चित हों कि चर शून्य नहीं है (जैसे आपने स्पष्ट रूप से इसकी जाँच की है) और आपको गैर-
अशक्त

7
@FMK मुझे मिल गया, धन्यवाद! मैं समझता हूं कि डबल बैंग का उपयोग यह संभव बनाने के लिए किया जाता है कि अशक्त प्रकार चर के मान गैर-अशक्त प्रकार चर में जाएं?
सैम

2
@ दाविद हाँ, बिल्कुल।
FMK

10

डबल-बैंग ऑपरेटरNullPointerException (या संक्षेप के लिए एनपीई) के प्रशंसकों के लिए एक उत्कृष्ट विकल्प है ।

नहीं-अशक्त अभिकथन ऑपरेटर !! एक के लिए किसी भी मूल्य धर्मान्तरित में गैर-शून्य प्रकार और एक अपवाद फेंकता है तो मान शून्य है।

val nonNull = a!!.length

तो आप लिख सकते हैं a!!, और यह a( Stringउदाहरण के लिए यहां) का एक गैर-शून्य मान लौटाएगा या aशून्य होने पर एक एनपीई फेंक देगा ।

यदि आप एक एनपीई चाहते हैं, तो आपके पास यह हो सकता है, लेकिन आपको इसके लिए स्पष्ट रूप से पूछना होगा। इस ऑपरेटर का उपयोग उन मामलों में किया जाना चाहिए जहां डेवलपर गारंटी दे रहा है - मूल्य कभी भी शून्य नहीं होगा


2
एक शुरुआत के रूप में पूछते हुए: मैं किसी भी मूल्य को गैर-अशक्त प्रकार में बदलना क्यों चाहूंगा?
वुल्फ 359

4
@ वोल्फ 359 यह आपको 100% सुनिश्चित करने की अनुमति देता है कि इसका मूल्य शून्य नहीं है। ("यह एक NPE डिबग करने के लिए आम समस्या है और एक कठिन समय रेखा / निष्पादन पथ का पता लगाने में है जो मान को अशक्त करने के लिए निर्धारित करता है। यह अशक्त असाइनमेंट एक अलग संदर्भ, वर्ग या दिन पर भी हो सकता है!" Cascader द्वारा)
गतिविधि को कम करना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.