无法在Kotlin的when语句中初始化变量

fumotvh3  于 2023-06-06  发布在  Kotlin
关注(0)|答案(2)|浏览(230)

不管是什么原因,我的Kotlin程序不会初始化when语句中分配的变量。代码如下:

import kotlin.random.Random
import kotlin.random.nextInt

val mood: String

when(Random.nextInt(1..2)) {
    1 -> {
        mood = "loud"
        println("$mood")
    }
    2 -> {
        mood = "quiet"
        println("$mood")
    }
}

println("$mood")

when语句内的行被打印出来,但是当我运行最后一行时,我得到了一个“Variable 'mood' must be initiated”错误。
我不知道我做错了什么。

9jyewag0

9jyewag01#

这是编译错误,不是执行错误。
从编译器的Angular 来看,when语句并不是详尽无遗的,因为Int可以不仅仅是1或2。实际上,nextInt(1..2)只返回那些数字,编译器没有考虑到这一点,它正在查看类型。
为了解决这个问题,你应该添加一个else语句,在这里你也初始化mood,例如:

val mood: String

when (Random.nextInt(1..2)) {
    1 -> {
        mood = "loud"
        println(mood)
    }

    2 -> {
        mood = "quiet"
        println(mood)
    }
    else -> {
        mood = "currently impossible"
    }
}

println(mood)

或者,您可以使用常规varlateinit var,而不是val
或者直接初始化一个正则var:

var mood: String = ""

或者使用lateinit var:

lateinit var mood: String

在后一种情况下,编译器不能再确保初始化(这实际上就是它在代码中首先抱怨的原因)。
此外,如果您希望在初始化后强制mood为只读,那么这两种可能都不可取。

c9qzyr3d

c9qzyr3d2#

在Kotlin中,使用瓦尔关键字声明的变量必须在声明点或类的构造函数中初始化。在代码中,mood变量声明时没有初始值,您试图在when语句中为其赋值。但是,编译器无法确定是否在运行时执行这两个分支中的任何一个,所以它不认为变量是完全初始化的。
要解决这个问题,您可以将mood变量声明为var而不是瓦尔,或者在声明它时为其赋值。下面是使用var的代码的更新版本:importKotlin.random.Random import kotlin.random.nextInt

var mood: String

when (Random.nextInt(1..2)) {
    1 -> {
        mood = "loud"
        println("$mood")
    }
    2 -> {
        mood = "quiet"
        println("$mood")
    }
}

println("$mood")

通过使用var而不是瓦尔,可以指示该变量以后可以重新分配。由于mood变量是在when语句的两个分支中赋值的,编译器不再抱怨它未初始化。
请注意,when分支的顺序应该涵盖所有可能的情况,否则您可能会遇到“when表达式必须详尽无遗”的警告。在您的例子中,nextInt的范围是1到2,因此两个分支应该足够了。

相关问题