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

raw
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")
}
  1. 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
  1. 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
  1. 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