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
相关产品推荐
相关产品推荐

