Kotlin:必须初始化变量'result'

Vis*_*hal 6 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)
}
Run Code Online (Sandbox Code Playgroud)

lel*_*man 6

问题是当你读到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)

您没有resultelse分支中分配值.你有几个选择,一个可以是可以为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)


nPn*_*nPn 5

正如 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 之一,则结果将为空。


jrt*_*ell 2

错误消息试图告诉您什么

变量“结果”必须初始化。

result这意味着在给代码赋值之前,您可以访问代码中的一些路径。

这是一个问题,因为这意味着您可能错过了处理某个情况的机会。

如何在不设置结果的情况下完成代码

如果用户输入5结果则不设置

怎么修

要么在 else 分支中设置结果,要么在声明中给它一个默认值