Məzmuna keç
Educora
Orta15 dəq4 / 14

Null təhlükəsizliyi

Kotlin tətbiqlərin çökməsinin ən məşhur səbəbindən necə qoruyur: `?` tipləri, `?.`, `?:`, `!!` və ağıllı tip çevrilməsi.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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.

Kotlin
fun main() {
    val name: String = "Aysel"
    var nickname: String? = null
    println(name.length)
    println(nickname)
    nickname = "Ays"
    println(nickname)
}
Gözlənilən nəticə
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.

Kotlin
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))
}
Gözlənilən nəticə
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:

Kotlin
fun main() {
    val good = "42".toIntOrNull()
    val bad = "forty-two".toIntOrNull()
    println(good)
    println(bad)
    println((bad ?: 0) + 1)
}
Gözlənilən nəticə
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.

Kotlin
val code: String? = "AZ1000"
println(code!!.length)    // 6

val empty: String? = null
println(empty!!.length)   // crash: NullPointerException

Ağı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.

Kotlin
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)
}
Gözlənilən nəticə
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 tipqiymət və ya null saxlayır
s?.lengthtəhlükəsiz çağırışs null-dursa, nəticə null olur
s ?: "none"Elvis operatorunull əvəzinə ehtiyat qiymət verir
s!!.lengthnull olmama iddiasınull-da proqramı çökdürür

Əsas fikirlər

  • Adi tiplər null saxlamır; String? kimi tiplər isə null ola bilər.
  • ?. null-da çökmək əvəzinə null qaytarır.
  • ?: (Elvis) sol tərəf null olanda ehtiyat qiyməti verir: name ?: "guest".
  • !! qorumanı söndürür və null-da NullPointerException atır — ondan qaç.
  • != null və ya is yoxlaması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.

1 / 10
Hansı sətir kompilyasiya olunur?