Null Safety Patterns
Require Not Null
Guard a nullable input before treating it as required.
require
`requireNotNull` is useful after code has decided that a missing value is invalid.
Require Not Null
RequireNotNull.kt
Replay: real traced execution (multi-file project)
fun describe(input: String?): String {
if (input == null) {
return "missing"
}
val required = requireNotNull(input)
return "required:${required.length}"
}
fun main() {
val input: String? = "token"
val result = describe(input)
println("input=${input ?: "none"}")
println("result=$result")
}
fun describe(input: String?): String {
if (input == null) {
return "missing"
}
val required = requireNotNull(input)
return "required:${required.length}"
}
fun main() {
val input: String? = null
val result = describe(input)
println("input=${input ?: "none"}")
println("result=$result")
}
fun describe(input: String?): String {
if (input == null) {
return "missing"
}
val required = requireNotNull(input)
return "required:${required.length}"
}
fun main() {
val input: String? = "value"
val result = describe(input)
println("input=${input ?: "none"}")
println("result=$result")
}
input ← token
10fun main() {11 val input→ token: String? = "token" //@input=null, "value"12 val result = describe(inputtoken)required ← token
1fun describe(inputtoken: String?): String {2 if (input == null) {3 return "missing"4 }56 val required→ token = requireNotNull(inputtoken)7 return "required:${required.length5}"8}result ← required:5
11 val input: String? = "token" //@input=null, "value"12 val result→ required:5 = describe(inputtoken)1314 println("input=${inputtoken ?: "none"}")15 println("result=$resultrequired:5")16}outputinput=token result=required:5
input ← null
10fun main() {11 val input→ null: String? = null12 val result = describe(inputnull)fun describe(input: String?): String
1fun describe(inputnull: String?): String {2 if (input == null) {if (input == null)
1fun describe(input: String?): String {2 if (inputnull == null) {3 return "missing"4 }result ← missing
11 val input: String? = null12 val result→ missing = describe(inputnull)1314 println("input=${inputnull ?: "none"}")15 println("result=$resultmissing")16}outputinput=none result=missing
input ← value
10fun main() {11 val input→ value: String? = "value"12 val result = describe(inputvalue)required ← value
1fun describe(inputvalue: String?): String {2 if (input == null) {3 return "missing"4 }56 val required→ value = requireNotNull(inputvalue)7 return "required:${required.length5}"8}result ← required:5
11 val input: String? = "value"12 val result→ required:5 = describe(inputvalue)1314 println("input=${inputvalue ?: "none"}")15 println("result=$resultrequired:5")16}outputinput=value result=required:5