编译器显示错误Kotlin:必须初始化变量result
。
这是代码。
fun main(args: Array<String>) {
print("Enter two numbers: ")
// nextDouble() reads the next double from the keyboard
var first= readLine()!!.toDouble()
var second = readLine()!!.toInt()
print("Enter an choice(1-4)): ")
val operator = readLine()!!.toInt()
var result: Double
when (operator) {
1 -> result = first + second
2 -> result = first - second
3 -> result = first * second
4 -> result = first / second
else -> {
println("Error.")
}
}
println("The result is :- " +result)
}
答案 0 :(得分:6)
问题在于,当您在此处阅读result
的值时:
println("The result is :- " +result)
result
可能未初始化,因为此处:
var result: Double
when (operator) {
1 -> result = first + second
2 -> result = first - second
3 -> result = first * second
4 -> result = first / second
else -> {
println("Error.")
}
您没有为result
分支中的else
分配值。您有几个选项,一个可以使result
可以为空。例如:
var result = when (operator) {
1 -> first + second
2 -> first - second
3 -> first * second
4 -> first / second
else -> null
}
if (result != null) {
println("The result is :- " + result)
} else {
println("Error.")
}
请注意,如果运算符不是(1-4),则result
的值将为null
。此外,在您的代码中,您正在打印“错误”,然后再次尝试打印结果。
要添加更多内容,如果使用when
语句定义运算符作为方法参考,则可以使事情变得更好:
print("Enter an choice(1-4)): ")
val operatorCode = readLine()!!.toInt()
val operator: ((Int) -> Double)? = when (operatorCode) {
1 -> first::plus
2 -> first::minus
3 -> first::times
4 -> first::div
else -> null
}
if (operator != null) {
val result = operator.invoke(second)
println("The result is :- " + result)
} else {
println("Error.")
}
答案 1 :(得分:3)
正如jrtapsell指出的那样,主要的问题是你声明结果是Double,但是既然你没有覆盖when语句中的每个可能的值,那么你正在访问一个未初始化的变量。
另一种选择,如果你真的是1-4以外的操作员想要它是一个错误条件而且不希望结果有效的Double是使用Optionals。
.as-console-wrapper { max-height: 100% !important; top: 0; }
在这种情况下,如果运算符不是1-4中的一个,则结果将为null。
答案 2 :(得分:1)
变量&#39;结果&#39;必须初始化。
这意味着在您为代码提供值之前,您可以通过代码访问result
。
这是一个问题,因为这意味着您可能错过了处理条件。
如果用户输入5结果未设置
在else分支中设置结果,或在声明中给它一个默认值