You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin编写计算器遇空安全错误:如何将输入转为Int类型?

解决Kotlin中readLine()转Int的空安全错误

问题场景

我正在学习Kotlin,掌握打印、变量、数据类型和列表知识后,尝试编写计算器应用,代码如下:

fun main() {
    println("Simple Calculator")
    
    println("Enter the first value")
    val num1: Int = readLine().toInt()

    println("Enter the second value")
    val num2: Int = readLine().toInt()

    println("$num1 + $num2 = ${num1 + num2}")
}

运行时出现错误:

Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'kotlin/String?'.

需要将num1和num2转换为Int类型,该如何解决?


问题原因

readLine()函数返回的是String?可空类型(当输入流关闭时会返回null),Kotlin的空安全机制不允许直接在可空对象上调用非空方法(比如toInt()),因此触发了上述错误。

解决方案

1. 非空断言(快速测试场景)

使用!!.强制断言readLine()不会返回null,适合简单测试场景,但要注意如果实际输入为null会抛出NullPointerException:

fun main() {
    println("Simple Calculator")
    
    println("Enter the first value")
    val num1: Int = readLine()!!.toInt()

    println("Enter the second value")
    val num2: Int = readLine()!!.toInt()

    println("$num1 + $num2 = ${num1 + num2}")
}

2. 安全调用+Elvis运算符(健壮处理null)

用?.安全调用toInt(),配合?:Elvis运算符处理null情况,比如给默认值或提示用户重新输入:

// 方式1:给默认值
fun main() {
    println("Simple Calculator")
    
    println("Enter the first value")
    val num1: Int = readLine()?.toInt() ?: 0

    println("Enter the second value")
    val num2: Int = readLine()?.toInt() ?: 0

    println("$num1 + $num2 = ${num1 + num2}")
}

// 方式2:提示用户重新输入(更友好)
fun readInt(prompt: String): Int {
    println(prompt)
    return readLine()?.toInt() ?: run {
        println("无效输入,请输入整数")
        readInt(prompt)
    }
}

fun main() {
    println("Simple Calculator")
    val num1 = readInt("Enter the first value")
    val num2 = readInt("Enter the second value")
    println("$num1 + $num2 = ${num1 + num2}")
}

3. 处理非整数输入(进阶稳定版)

上述方案未处理用户输入非整数的情况(会抛出NumberFormatException),可以用toIntOrNull()替代toInt(),它会把非整数输入转为null,再结合递归提示用户:

fun readValidInt(prompt: String): Int {
    println(prompt)
    val input = readLine()?.toIntOrNull()
    return if (input != null) {
        input
    } else {
        println("请输入有效的整数")
        readValidInt(prompt)
    }
}

fun main() {
    println("Simple Calculator")
    val num1 = readValidInt("Enter the first value")
    val num2 = readValidInt("Enter the second value")
    println("$num1 + $num2 = ${num1 + num2}")
}

内容的提问来源于stack exchange,提问作者RaghavCodez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:30:06