Kotlin:变量'结果'必须初始化

时间:2018-03-09 17:40:52

标签: kotlin

编译器显示错误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)
}

3 个答案:

答案 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分支中设置结果,或在声明中给它一个默认值