Null Safety؛ ضدحال بزرگ NullPointerException
کاتلین اومده که اون ارور معروف «هیچی نبود ولی صداش زدی» کمتر آبروتو ببره.
بهصورت پیشفرض null ممنوع
در کاتلین یک `String` معمولی نمیتونه null باشه. اگر واقعاً ممکنه null بشه، باید با `?` اعلام کنی. زبان میگه: داداش، از قبل بگو کجا ممکنه زمین بخوریم.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
var name: String = "Ali"
// name = null // خطا
var nickname: String? = null
println(nickname)
null
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 نیست. اگر اشتباه کنی، برنامه با افتخار کرش میکنه. کم استفاده کن؛ مثل فلفل تند، زیادهروی نکنی بهتره.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
val value: String? = "OK"
println(value!!.length)
2
نتیجه این درس 🎯
Null Safety یکی از همان جاهایی است که کاتلین باهوشتر از خیلی زبانها رفتار میکند. nullable را واضح کن، با safe call جلو برو، و !! را مثل دکمه انفجار فقط اضطراری بزن.
تمرین! 🧠
یک نام nullable تعریف کن؛ اگر null بود «ناشناس» چاپ کن، اگر نبود طول نام را چاپ کن.
fun main() {
val name: String? = null
val result = name?.length ?: "ناشناس"
println(result)
}
ناشناس