如果局部变量在未设置任何内容时获取默认值,为什么必须初始化获取变量 '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}. [...]
简单来说,您可以将其想象成编译器跟踪状态为“已分配”或“未分配”的列表中的每个变量。
我有这样的代码(在函数内):
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}. [...]
简单来说,您可以将其想象成编译器跟踪状态为“已分配”或“未分配”的列表中的每个变量。