编译器显示错误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)
}
Run Code Online (Sandbox Code Playgroud)
问题是当你读到result这里的值时:
println("The result is :- " +result)
Run Code Online (Sandbox Code Playgroud)
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.")
}
Run Code Online (Sandbox Code Playgroud)
您没有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.")
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果操作者不是(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.")
}
Run Code Online (Sandbox Code Playgroud)
正如 jrtapsell 指出的,主要问题是您将 result 声明为 Double ,但由于您没有涵盖 when 语句中的所有可能值,因此您正在访问一个未初始化的变量。
另一种选择,如果你真的不是 1-4 的运算符希望它是一个错误条件并且不希望结果以有效的 Double 结束,则使用 Optionals。
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? = null
when (operator) {
1 -> result = first + second
2 -> result = first - second
3 -> result = first * second
4 -> result = first / second
else -> {
println("Error.")
}
}
// only print the result if not null
result?.let {
println("The result is :- " +result)
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果运算符不是 1-4 之一,则结果将为空。
变量“结果”必须初始化。
result这意味着在给代码赋值之前,您可以访问代码中的一些路径。
这是一个问题,因为这意味着您可能错过了处理某个情况的机会。
如果用户输入5结果则不设置
要么在 else 分支中设置结果,要么在声明中给它一个默认值