null-un nə olduğunu və adi tiplə null ola bilən tipin fərqini izah etmək?.və?:operatorları ilə null qiymətləri təhlükəsiz emal etmək!!operatorunun riskini başa düşmək- Ağıllı tip çevrilməsindən (
!= null,is) istifadə etmək
Qeydiyyat formasında «ata adı» xanası boş qala bilər, istifadəçi profil şəkli yükləməyə də bilər. Proqramlaşdırmada «qiymət yoxdur» vəziyyəti null ilə göstərilir. Java kimi dillərdə null olan dəyişəndən istifadə etmək proqramı NullPointerException xətası ilə çökdürür və bu, illərlə Android tətbiqlərinin ən çox rast gəlinən çökmələrindən biri olub. Kotlin bu problemi hələ kompilyasiya zamanı həll edir.
Null ola bilən tiplər
Kotlin-də adi tiplər null saxlaya bilməz: val name: String = null yazsan, kompilyator xəta verəcək. Dəyişənin boş qala biləcəyini bildirmək üçün tipin sonuna sual işarəsi qoyulur: String? — «sətir və ya null». Beləliklə, hansı qiymətin yox ola biləcəyi kodun özündə yazılmış olur.
fun main() {
val name: String = "Aysel"
var nickname: String? = null
println(name.length)
println(nickname)
nickname = "Ays"
println(nickname)
}5 null Ays
Bu proqramda nickname.length yazmaq olmaz — kompilyator buna icazə vermir, çünki nickname null ola bilər. Kotlin səni əvvəlcə «qiymət yoxdursa, nə edək?» sualına cavab verməyə məcbur edir. Bunun üçün xüsusi operatorlar var.
Təhlükəsiz çağırış ?. və Elvis operatoru ?:
Təhlükəsiz çağırış ?. belə işləyir: qiymət varsa, metod çağırılır; null-dursa, bütün ifadə sadəcə null olur və proqram çökmür. Elvis operatoru ?: isə sol tərəf null olanda sağ tərəfdəki ehtiyat qiyməti verir. Adını yan tərəfə çevrilmiş ?: işarəsinin Elvis Preslinin saç düzümünə bənzəməsindən alıb.
fun main() {
val city: String? = null
val country: String? = "Azerbaijan"
println(city?.length)
println(country?.length)
println(city ?: "unknown")
val len = city?.length ?: 0
println("Length: $len")
println(country?.uppercase()?.take(3))
}null 10 unknown Length: 0 AZE
?. çağırışlarını zəncir kimi ardıcıl yazmaq olar; take(3) ilk 3 simvolu götürür.Null ola bilən qiymətlər real kodda tez-tez yaranır. Məsələn, toIntOrNull() sətri ədədə çevirir, alınmadıqda isə xəta atmaq əvəzinə null qaytarır — Elvis operatoru ilə birlikdə bu, istifadəçinin daxil etdiyi məlumatı yoxlamağın rahat yoludur:
fun main() {
val good = "42".toIntOrNull()
val bad = "forty-two".toIntOrNull()
println(good)
println(bad)
println((bad ?: 0) + 1)
}42 null 1
!! operatoru — «mən əminəm»
!! operatoru kompilyatora deyir: «Bu qiymət null deyil, mən əminəm». Əgər yanılırsansa, proqram elə həmin yerdə NullPointerException ilə çökür. Yəni !! Kotlin-in verdiyi qorumanı könüllü olaraq söndürür.
val code: String? = "AZ1000"
println(code!!.length) // 6
val empty: String? = null
println(empty!!.length) // crash: NullPointerExceptionAğıllı tip çevrilməsi
if (email != null) yoxlamasından sonra blokun içində Kotlin email-i avtomatik olaraq adi String sayır — buna ağıllı tip çevrilməsi (smart cast) deyilir. is operatoru ilə tip yoxlananda da eyni şey baş verir. Any isə istənilən qiymətin aid olduğu ümumi tipdir.
fun main() {
val email: String? = "leyla@example.com"
if (email != null) {
println("Email has ${email.length} characters")
}
val value: Any = 42
val text = when (value) {
is String -> "a string of length ${value.length}"
is Int -> "an Int, doubled: ${value * 2}"
else -> "something else"
}
println(text)
}Email has 17 characters an Int, doubled: 84
is Int budağında value artıq Int sayılır, ona görə onu 2-yə vurmaq olur.| Yazılış | Adı | Nə edir |
|---|---|---|
String? | null ola bilən tip | qiymət və ya null saxlayır |
s?.length | təhlükəsiz çağırış | s null-dursa, nəticə null olur |
s ?: "none" | Elvis operatoru | null əvəzinə ehtiyat qiymət verir |
s!!.length | null olmama iddiası | null-da proqramı çökdürür |
Əsas fikirlər
- Adi tiplər
nullsaxlamır;String?kimi tiplər isənullola bilər. ?.null-da çökmək əvəzinənullqaytarır.?:(Elvis) sol tərəfnullolanda ehtiyat qiyməti verir:name ?: "guest".!!qorumanı söndürür və null-da NullPointerException atır — ondan qaç.!= nullvə yaisyoxlamasından sonra kompilyator tipi özü dəqiqləşdirir (smart cast).
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.