Elvis操作符在Kotlin中不工作,而synthax似乎是正确的

ql3eal8s  于 2023-03-30  发布在  Kotlin
关注(0)|答案(1)|浏览(126)

我正在从this YouTube video学习Kotlin,在35:45他正在运行以下代码:

我试过运行完全相同的代码:

fun main() {
    val x = readLine()?:"1"
    val y = readLine()?:"1"
    val z = x.toInt() + y.toInt()
    print(z)
}

但我得到这个错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at MainKt.main(Main.kt:4)
at MainKt.main(Main.kt)

有人能帮帮我吗?我真的是Kotlin的菜鸟(也是软件编程的菜鸟),我还没有在网上找到答案。
谢谢大家。

mnemlml8

mnemlml81#

Elvis运算符仅在左操作数为null时计算右操作数。空字符串""null不同。
readLine()在检测到“文件结束”时返回null。当从文件阅读时,这显然是在到达结束时。当从stdin(控制台的标准输入)读取时,这通常是在按Ctrl+D时。
如果您只按Enter键,您实际上输入的是一个 * 空 * 行(""),而不是“文件结束”。
如果你想在命令行上按Enter键时得到这种默认值,那么你应该对空字符串而不是null做出React。正如@lukas.j提到的,一种方法是使用ifEmpty来提供默认值:

val x = readln().ifEmpty { "1" }

相关问题