Mark a value nullable and branch before using it.

null A `?` after a type means the value can be either present or `null`.

Nullable Basics

nickname
NullableBasics.kt
Replay: real traced execution (multi-file project)
fun main() {
    val nickname: String? = "Nova"
    val status: String

    if (nickname == null) {
        status = "missing"
    } else {
        status = "present:${nickname.length}"
    }

    println("nickname=${nickname ?: "guest"}")
    println("status=$status")
}
fun main() {
    val nickname: String? = null
    val status: String

    if (nickname == null) {
        status = "missing"
    } else {
        status = "present:${nickname.length}"
    }

    println("nickname=${nickname ?: "guest"}")
    println("status=$status")
}
fun main() {
    val nickname: String? = "Kai"
    val status: String

    if (nickname == null) {
        status = "missing"
    } else {
        status = "present:${nickname.length}"
    }

    println("nickname=${nickname ?: "guest"}")
    println("status=$status")
}
  1. nickname ← Nova

    1fun main() {2    val nickname→ Nova: String? = "Nova" //@nickname=null, "Kai"3    val status: String
  2. status ← present:4

    6    status = "missing"7} else {8    status→ present:4 = "present:${nickname.length4}"9}
    values this stepNovanickname
  3. println("nickname=${nickname ?: "guest"}")

    11    println("nickname=${nicknameNova ?: "guest"}")12    println("status=$statuspresent:4")13}
    outputnickname=Nova
    status=present:4
  1. nickname ← null

    1fun main() {2    val nickname→ null: String? = null3    val status: String
  2. status ← missing

    5if (nicknamenull == null) {6    status→ missing = "missing"7} else {
  3. println("nickname=${nickname ?: "guest"}")

    11    println("nickname=${nicknamenull ?: "guest"}")12    println("status=$statusmissing")13}
    outputnickname=guest
    status=missing
  1. nickname ← Kai

    1fun main() {2    val nickname→ Kai: String? = "Kai"3    val status: String
  2. status ← present:3

    6    status = "missing"7} else {8    status→ present:3 = "present:${nickname.length3}"9}
    values this stepKainickname
  3. println("nickname=${nickname ?: "guest"}")

    11    println("nickname=${nicknameKai ?: "guest"}")12    println("status=$statuspresent:3")13}
    outputnickname=Kai
    status=present:3

Follow the Branch

  1. nickname can hold text or null.
  2. The if checks for null first.
  3. The null branch sets status to missing.
  4. The present branch can safely read nickname.length. | nickname value | Branch | status | | --- | --- | --- | | "Nova" | present | present:4 | | null | missing | missing |

Exercise: NullableBasics.kt

Branch on a nullable nickname and print one status for null and another for present text