如果局部变量在未设置任何内容时获取默认值,为什么必须初始化获取变量 'xxx'?

Why getting Variable 'xxx' must be initialized if local variable is getting a default value when nothing is set?

我有这样的代码(在函数内):

var a: String?
if (a != null) {
    // doSometing()
}

我在没有 if 语句的情况下调试了一段代码,发现默认情况下将空值分配给 a 变量。那么为什么编译器会导致错误说:

Variable 'a' must be initialized

我在这里错过了什么?

当然你可以只编译然后运行像这样:

var a: String?
println() // breakpoint here

调试器将显示 a 已用 null 初始化。如果您查看反编译的字节码,您会看到相同的内容:

public static final void main() {
   String a = null;
   // ...
}

每个变量都要初始化,这是语言本身的限制。让我们看一下 Kotlin 语言规范 (12.2.2):

Kotlin allows non-delegated properties to not have initializers in their declaration as long as the property is definitely assigned before its first usage.

似乎语言规范甚至将局部变量称为属性。见 here.

既然我们没有在我的例子中使用它就可以了,它仍然必须在内部有一些价值,对吧?

现在你会想知道,Kotlin 如何跟踪未初始化的变量,当它们已经被赋值时 null:

This property is checked by the variable initialization analysis (VIA). VIA operates on abstract values from a flat assignedness lattice of two values {Assigned, Unassigned}. [...]

简单来说,您可以将其想象成编译器跟踪状态为“已分配”或“未分配”的列表中的每个变量。