Exceptions and Defensive Coding
Safe Parsing
Avoid an exception by using a nullable parsing result.
safe-parse
`toIntOrNull` returns `null` instead of throwing when a string is not a number.
Safe Parsing
SafeParsing.kt
Replay: real traced execution (multi-file project)
fun main() {
val raw = "15"
val parsed = raw.toIntOrNull()
val value = parsed ?: -1
val status = if (parsed == null) {
"fallback"
} else {
"parsed"
}
println("raw=$raw")
println("value=$value")
println("status=$status")
}
fun main() {
val raw = "bad"
val parsed = raw.toIntOrNull()
val value = parsed ?: -1
val status = if (parsed == null) {
"fallback"
} else {
"parsed"
}
println("raw=$raw")
println("value=$value")
println("status=$status")
}
fun main() {
val raw = "4"
val parsed = raw.toIntOrNull()
val value = parsed ?: -1
val status = if (parsed == null) {
"fallback"
} else {
"parsed"
}
println("raw=$raw")
println("value=$value")
println("status=$status")
}
raw ← 15, parsed ← 15, value ← 15, status ← parsed
1fun main() {2 val raw→ 15 = "15" //@raw="bad", "4"3 val parsed→ 15 = raw15.toIntOrNull()4 val value→ 15 = parsed15 ?: -15 val status→ parsed = if (parsed15 == null) {6 "fallback"7 } else {8 "parsed"9 }1011 println("raw=$raw15")12 println("value=$value15")13 println("status=$statusparsed")14}outputraw=15 value=15 status=parsed
raw ← bad, parsed ← null, value ← -1, status ← fallback
1fun main() {2 val raw→ bad = "bad"3 val parsed→ null = rawbad.toIntOrNull()4 val value→ -1 = parsednull ?: -15 val status→ fallback = if (parsednull == null) {6 "fallback"7 } else {8 "parsed"9 }1011 println("raw=$rawbad")12 println("value=$value-1")13 println("status=$statusfallback")14}outputraw=bad value=-1 status=fallback
raw ← 4, parsed ← 4, value ← 4, status ← parsed
1fun main() {2 val raw→ 4 = "4"3 val parsed→ 4 = raw4.toIntOrNull()4 val value→ 4 = parsed4 ?: -15 val status→ parsed = if (parsed4 == null) {6 "fallback"7 } else {8 "parsed"9 }1011 println("raw=$raw4")12 println("value=$value4")13 println("status=$statusparsed")14}outputraw=4 value=4 status=parsed