परिचय
`!!` ऑपरेटर ("नॉट-नल असर्शन ऑपरेटर") किसी भी 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`
- क्रैश संदेश में लाइन नंबर के अलावा कोई जानकारी नहीं होती