Null Safety Patterns
Nullable Basics
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
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")
}
nickname ← Nova
1fun main() {2 val nickname→ Nova: String? = "Nova" //@nickname=null, "Kai"3 val status: Stringstatus ← present:4
6 status = "missing"7} else {8 status→ present:4 = "present:${nickname.length4}"9}values this stepNovanicknameprintln("nickname=${nickname ?: "guest"}")
11 println("nickname=${nicknameNova ?: "guest"}")12 println("status=$statuspresent:4")13}outputnickname=Nova status=present:4
nickname ← null
1fun main() {2 val nickname→ null: String? = null3 val status: Stringstatus ← missing
5if (nicknamenull == null) {6 status→ missing = "missing"7} else {println("nickname=${nickname ?: "guest"}")
11 println("nickname=${nicknamenull ?: "guest"}")12 println("status=$statusmissing")13}outputnickname=guest status=missing
nickname ← Kai
1fun main() {2 val nickname→ Kai: String? = "Kai"3 val status: Stringstatus ← present:3
6 status = "missing"7} else {8 status→ present:3 = "present:${nickname.length3}"9}values this stepKainicknameprintln("nickname=${nickname ?: "guest"}")
11 println("nickname=${nicknameKai ?: "guest"}")12 println("status=$statuspresent:3")13}outputnickname=Kai status=present:3
Follow the Branch
nicknamecan hold text ornull.- The
ifchecks fornullfirst. - The null branch sets
statustomissing. - The present branch can safely read
nickname.length. |nicknamevalue | 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