【问题标题】:Kotlin: Variable 'result' must be initializedKotlin:必须初始化变量“结果”
【发布时间】:2018-03-09 17:40:52
【问题描述】:

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    问题是当你在这里读取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.")
        }
    

    您没有在 else 分支中为 result 赋值。您有多种选择,一种可能是使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.")
    }
    

    【讨论】:

      【解决方案2】:

      正如 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)
          }
      }
      

      在这种情况下,如果运算符不是 1-4 之一,则结果将为空。

      【讨论】:

        【解决方案3】:

        试图告诉你的错误信息是什么

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

        这意味着在您给它一个值之前,您可以通过代码访问result 的路径。

        这是一个问题,因为这意味着您可能错过了处理条件。

        如何在不设置结果的情况下通过代码

        如果用户输入5结果未设置

        如何解决

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          • 1970-01-01
          • 2020-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多