8

Null Safety؛ ضدحال بزرگ NullPointerException

کاتلین اومده که اون ارور معروف «هیچی نبود ولی صداش زدی» کمتر آبروتو ببره.

درس 8 از 20

به‌صورت پیش‌فرض null ممنوع

در کاتلین یک `String` معمولی نمی‌تونه null باشه. اگر واقعاً ممکنه null بشه، باید با `?` اعلام کنی. زبان می‌گه: داداش، از قبل بگو کجا ممکنه زمین بخوریم.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

Nullable type
var name: String = "Ali"
// name = null // خطا

var nickname: String? = null
println(nickname)
خروجی یا نتیجه اجرا
null
نکته کاربردی: این بخش اسکلت ذهنی درس را می‌سازد. وقتی بدانی این قطعه دقیقاً چه مسئله‌ای را حل می‌کند، بعداً موقع پروژه فقط syntax حفظی تحویل نمی‌دهی؛ تصمیم درست می‌گیری. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

Safe call

با `?.` فقط وقتی مقدار null نیست بهش دسترسی پیدا می‌کنی. اگر null بود، خروجی null می‌شه و برنامه قهر نمی‌کنه.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

?.
val text: String? = null
println(text?.length) // null
خروجی یا نتیجه اجرا
null
نکته کاربردی: اینجا باید به رفتار کد نگاه کنی، نه فقط ظاهرش. مقدارها را عوض کن و دوباره اجرا بگیر تا دستت بفهمد برنامه چطور واکنش نشان می‌دهد. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

Elvis operator

`?:` یعنی اگر سمت چپ null بود، مقدار جایگزین بده. اسمش Elvisه چون شبیه مدل موی الویسه؛ کاتلین حتی در اپراتور هم استایل داره.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

?:
val username: String? = null
val displayName = username ?: "کاربر مهمان"
println(displayName)
خروجی یا نتیجه اجرا
کاربر مهمان
نکته کاربردی: این الگو در پروژه واقعی زیاد تکرار می‌شود. از همین حالا تمیز و خوانا بنویس تا بعداً موقع دیباگ، خودت به خودت فحش ندهی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

!!؛ دکمه قرمز خطرناک

با `!!` به کامپایلر می‌گی: مطمئنم null نیست. اگر اشتباه کنی، برنامه با افتخار کرش می‌کنه. کم استفاده کن؛ مثل فلفل تند، زیاده‌روی نکنی بهتره.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

Not-null assertion
val value: String? = "OK"
println(value!!.length)
خروجی یا نتیجه اجرا
2
نکته کاربردی: نکته حرفه‌ای این است که Kotlin معمولاً راه کوتاه‌تر دارد، ولی کوتاه‌تر همیشه بهتر نیست. اول خوانایی، بعد زرنگ‌بازی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

نتیجه این درس 🎯

Null Safety یکی از همان جاهایی است که کاتلین باهوش‌تر از خیلی زبان‌ها رفتار می‌کند. nullable را واضح کن، با safe call جلو برو، و !! را مثل دکمه انفجار فقط اضطراری بزن.

تمرین! 🧠

یک نام nullable تعریف کن؛ اگر null بود «ناشناس» چاپ کن، اگر نبود طول نام را چاپ کن.

جواب تمرین
fun main() {
    val name: String? = null

    val result = name?.length ?: "ناشناس"
    println(result)
}
خروجی جواب
ناشناس