المعامل !!
فرض عدم قابلية القيمة لـ null ومخاطره
المعامل !! درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
فرض عدم كون القيمة null
أحيانًا تكون متأكدًا من أن قيمة nullable ليست null، لكن المترجم يستمر في إظهار خطأ.
يخبر معامل التأكيد على عدم كون القيمة null !! المترجم بأن يثق بك وأن يتعامل مع القيمة على أنها غير null.
الاستخدام الأساسي
تؤدي إضافة !! إلى تحويل النوع nullable إلى نظيره غير null.
إذا كانت القيمة غير null فعلًا، فسيعمل الكود تمامًا كما يعمل الاستدعاء العادي.
fun main() {
val name: String? = "Kotlin"
println(name!!.length)
}الخطر
إذا كانت القيمة null فعلًا، فإن !! يطرح NullPointerException في ذلك الموضع مباشرةً.
هذا هو الموضع الوحيد الذي تسمح فيه Kotlin بحدوث NPE، وتقع المسؤولية عنه بالكامل عليك.
fun main() {
val name: String? = null
try {
println(name!!.length)
} catch (e: NullPointerException) {
println("Boom: NullPointerException")
}
}سبب وجوده
صُمّم هذا المعامل ليكون مزعجًا عمدًا. فعلامتا التعجب تبرزان في مراجعة الكود، وتشيران إلى موضع تجاوزت فيه شبكة الأمان.
وهو موجود للحالات النادرة التي تعرف فيها حقًا أكثر مما يعرفه المترجم.
الاستدعاء الآمن أفضل عادةً
في معظم الحالات، يكون استخدام الاستدعاء الآمن ?. مع Elvis ?: أكثر أمانًا وقصرًا بالقدر نفسه.
قارن بين النهجين أدناه لتحقيق الهدف نفسه.
fun main() {
val name: String? = null
val safeLength = name?.length ?: 0
println(safeLength)
}تجنّب تسلسل معاملات !!
لا تسلسل معاملات !! متعددة مثل a!!.b!!.c. فإذا حدث انهيار، فلن تعرف أي جزء كانت قيمته null.
قسّم التعبير إلى أجزاء أو استخدم الاستدعاءات الآمنة بدلًا من ذلك.
fun main() {
val text: String? = "hi"
// bad style: text!!.uppercase()!! is hard to debug
val good = text?.uppercase() ?: ""
println(good)
}استخدام مشروع
إحدى الحالات المقبولة هي قيمة عيّنتها سابقًا وتعرف أنها أصبحت مهيّأة الآن.
ومع ذلك، فضّل استخدام lateinit أو إعادة هيكلة الكود متى أمكن.
fun main() {
var config: String? = null
config = "loaded"
// we just assigned it, so !! is safe here
println(config!!.uppercase())
}قراءة تتبّع المكدس
عندما يفشل !!، يشير الاستثناء إلى السطر المحدد بالضبط. وهذه الدقة هي ميزته الوحيدة مقارنةً بالحصول على نتيجة خاطئة من دون تنبيه.
استخدم الرسالة للعثور على الافتراض الخاطئ وإصلاحه.
fun length(text: String?): Int {
return text!!.length
}
fun main() {
println(length("abc"))
// length(null) would throw on the !! line
}إزالة !! بإعادة الهيكلة
يمكن إزالة معظم استخدامات !! من خلال التعامل مع null بطريقة صحيحة. في المثال أدناه، تجعل قيمة Elvis البديلة الدالة شاملة وخالية من الانهيارات.
fun length(text: String?): Int {
return text?.length ?: 0
}
fun main() {
println(length("abc"))
println(length(null))
}قاعدة عامة
تعامل مع كل !! على أنه سؤال: هل أنا متأكد تمامًا من أن هذه القيمة لن تكون null أبدًا؟
- إذا كانت الإجابة نعم وكانت الحالة نادرة → فاستخدامه مقبول
- إذا لم تكن متأكدًا → فاستخدم
?.و?:
جمع المفاهيم
معامل !! أداة حادة:
- يفرض تحويل قيمة nullable إلى نوع غير null
- يطرح NullPointerException إذا كانت القيمة null
- فضّل الاستدعاءات الآمنة وElvis في جميع الحالات تقريبًا
fun main() {
val sure: String? = "definitely here"
println(sure!!.length)
val maybe: String? = null
println(maybe?.length ?: -1)
}اختبار سريع
اختبر مدى فهمك لمعامل التأكيد على عدم كون القيمة null.
مراجعة
لقد تعلّمت معامل !!:
- يؤكد أن قيمة nullable ليست null
- يطرح NullPointerException عند استخدامه على نحو خاطئ
- ينبغي أن يكون حلًا أخيرًا لا عادةً متّبعة
سترى بعد ذلك كيف تصل إمكانية كون القيمة null من Java عبر أنواع المنصة.
الأسئلة الشائعة
هل درس «المعامل !!» مجاني؟
نعم — نص درس «المعامل !!» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «المعامل !!»؟
فرض عدم قابلية القيمة لـ null ومخاطره تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «المعامل !!»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.