不管是什么原因,我的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”错误。
我不知道我做错了什么。
2条答案
按热度按时间9jyewag01#
这是编译错误,不是执行错误。
从编译器的Angular 来看,
when
语句并不是详尽无遗的,因为Int
可以不仅仅是1或2。实际上,nextInt(1..2)
只返回那些数字,编译器没有考虑到这一点,它正在查看类型。为了解决这个问题,你应该添加一个else语句,在这里你也初始化
mood
,例如:或者,您可以使用常规
var
或lateinit var
,而不是val
。或者直接初始化一个正则var:
或者使用lateinit var:
在后一种情况下,编译器不能再确保初始化(这实际上就是它在代码中首先抱怨的原因)。
此外,如果您希望在初始化后强制
mood
为只读,那么这两种可能都不可取。c9qzyr3d2#
在Kotlin中,使用瓦尔关键字声明的变量必须在声明点或类的构造函数中初始化。在代码中,mood变量声明时没有初始值,您试图在when语句中为其赋值。但是,编译器无法确定是否在运行时执行这两个分支中的任何一个,所以它不认为变量是完全初始化的。
要解决这个问题,您可以将mood变量声明为var而不是瓦尔,或者在声明它时为其赋值。下面是使用var的代码的更新版本:importKotlin.random.Random import kotlin.random.nextInt
通过使用var而不是瓦尔,可以指示该变量以后可以重新分配。由于mood变量是在when语句的两个分支中赋值的,编译器不再抱怨它未初始化。
请注意,when分支的顺序应该涵盖所有可能的情况,否则您可能会遇到“when表达式必须详尽无遗”的警告。在您的例子中,nextInt的范围是1到2,因此两个分支应该足够了。