Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

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

परिचय

`!!` ऑपरेटर ("नॉट-नल असर्शन ऑपरेटर") किसी भी nullable मान को non-null में बदलता है। यदि मान `null` है, तो `NullPointerException` फेंकता है।

उदाहरण 1: बिना !! के

fun main() {
    var name: String? = null
    println(name)  // null प्रिंट करता है, कोई क्रैश नहीं
}

आउटपुट

null

उदाहरण 2: !! के साथ - NPE फेंकता है

fun main() {
    var name: String? = null
    
    // !! नल होने पर NPE फेंकता है
    val length = name!!.length  
    println(length)
}

आउटपुट

Exception in thread "main" java.lang.NullPointerException
    at MainKt.main(main.kt:5)

सुरक्षित विकल्प

1. सेफ कॉल (?.) + एल्विस (?:)

fun main() {
    var name: String? = null
    
    // नल होने पर डिफ़ॉल्ट मान
    val length = name?.length ?: 0
    println("लंबाई: $length")  // 0
    
    name = "Kotlin"
    val length2 = name?.length ?: 0
    println("लंबाई: $length2")  // 6
}

2. let के साथ सुरक्षित ब्लॉक

fun main() {
    var name: String? = "Kotlin"
    
    name?.let { nonNullName ->
        println("नाम लंबाई: ${nonNullName.length}")
        println("अपरकेस: ${nonNullName.uppercase()}")
    } ?: println("नाम नल है")
}

3. कॉन्ट्रैक्ट्स के साथ (Kotlin 1.3+)

fun processNonNull(str: String) {
    println("प्रोसेसिंग: ${str.length}")
}

fun main() {
    var name: String? = getName()
    
    // स्मार्ट कास्ट - चेक के बाद नॉन-नल माना जाता है
    if (name != null) {
        processNonNull(name)  // यहां name String है, String? नहीं
    }
}

fun getName(): String? = "Kotlin"

!! का उपयोग कब करें (और कब नहीं)

स्थितिसिफारिश
मान तार्किक रूप से कभी नल नहीं हो सकता!! स्वीकार्य (लेकिन डिजाइन पर पुनर्विचार करें)
टेस्ट कोड / क्विक प्रोटोटाइप!! ठीक है
प्रोडक्शन कोड में अनिश्चित नलता!! न करें - ?. ?: या if चेक उपयोग करें
लाइब्रेरी API जो नॉन-नल लौटाता है लेकिन प्लेटफॉर्म टाइप है!! सामान्य (प्लेटफॉर्म टाइप्स के लिए)

प्लेटफॉर्म टाइप्स के साथ !!

// जावा कोड: public String getName() { return "John"; }  // @NonNull एनोटेशन नहीं
// Kotlin से कॉल:
fun main() {
    // जावा मेथड प्लेटफॉर्म टाइप String! लौटाता है
    val javaName: String = getJavaName()!!  // प्लेटफॉर्म टाइप के लिए !! सामान्य
    println(javaName.length)
}

// जावा इंटरऑप के लिए बेहतर: एनोटेशन उपयोग करें
// @NonNull public String getName() - तब Kotlin इसे String के रूप में देखता है

सारांश

  • `!!` = "मुझे पता है यह नल नहीं है, अगर है तो क्रैश कर दो"
  • प्रोडक्शन कोड में न्यूनतम उपयोग करें
  • बेहतर: `?.`, `?:`, `if (x != null)`, `let`
  • क्रैश संदेश में लाइन नंबर के अलावा कोई जानकारी नहीं होती
  1.  मेरा नाम जेफ है  मीम क्या है? "मेरा नाम जेफ है" मीम क्या है?

    यदि आपने 2017 की शुरुआत में ऐप बंद होने से पहले वाइन पर वीडियो देखने में कोई समय बिताया है, तो आपको मेरा नाम जेफ है मीम याद हो सकता है। आज, फिल्म 22 जंप स्ट्रीट का यह प्रसिद्ध उद्धरण टिकटॉक और इसी तरह के प्लेटफॉर्म पर पॉप अप होता रहता है। मेरा नाम जेफ है मीम की उत्पत्ति मेरा नाम जेफ है लाइन 22 जंप

  1. - पायथन के ** ऑपरेटर की एसोसिएटिविटी क्या है?

    पायथन डॉक्स से: एक ही बॉक्स में ऑपरेटर बाएं से दाएं ग्रुप होते हैं (तुलना को छोड़कर), जिसमें टेस्ट भी शामिल हैं, जिनकी सभी की समान प्रीसिडेंस होती है और बाएं से दाएं चेन होती हैं — देखें सेक्शन तुलना — और एक्सपोनेंशिएशन, जो दाएं से बाएं ग्रुप होता है। तो ** ऑपरेटर (एक्सपोनेंशिएशन) राइट-टू-लेफ्ट एसो

  1. - पायथन में &= ऑपरेटर क्या करता है?

    &= ऑपरेटर object.__iand__() फ़ंक्शन के लिए सिंटैक्टिक शुगर है। पायथन डॉक्स से: ये मेथड ऑगमेंटेड अंकगणितीय असाइनमेंट (+=, -=, *=, @=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |=) को इम्प्लीमेंट करने के लिए कॉल किए जाते हैं। ये मेथड इन-प्लेस ऑपरेशन (self को मॉडिफाई करना) करने का प्रयास करना चा