Kotlin &引用;属性必须初始化或是抽象的;引发异常时在init块中
为什么kotlin reportKotlin &引用;属性必须初始化或是抽象的;引发异常时在init块中,kotlin,Kotlin,为什么kotlin report属性必须初始化或抽象。对象构造永远不会完成,因此无论a是否初始化都不重要。是否可以用一个案例来说明这是一个问题 class Foo { private val a: Int init { a = 42 throw Exception() } } fun main() { Foo() } 然而,这些工作刚刚好 fun bar() { throw Exception() } class
属性必须初始化或抽象。对象构造永远不会完成,因此无论a
是否初始化都不重要。是否可以用一个案例来说明这是一个问题
class Foo {
private val a: Int
init {
a = 42
throw Exception()
}
}
fun main() {
Foo()
}
然而,这些工作刚刚好
fun bar() {
throw Exception()
}
class Foo {
private val a: Int
init {
a = 42
bar()
}
}
fun main() {
Foo()
}
类似的java代码按预期工作:
公共类测试{
私有静态类Foo{
私人终审法院;
public Foo()引发异常{
a=42;
抛出新异常();
}
}
公共静态void main(字符串[]args)引发异常{
新Foo();
}
}
下面的链接很好地回答了这个问题。
本质上,它归结为每个“val”(属性)都有一个支持字段。如果可以提供支持字段,则无需初始化该字段。下面是一个小例子
class Foo {
private val a: Int
get() = getValue()
}
fun getValue():Int {
throw Exception()
}
fun main() {
Foo()
}
类似的java代码按预期工作:
默认情况下,Java将字段初始化为0(或null
/false
,具体取决于类型)。例如,您可以通过在a=42
行之前打印a
的值来查看它
Kotlin没有,因为这种隐式初始化很容易忘记初始化属性,并且没有提供太多好处。因此,它要求您初始化所有具有支持字段的属性 这似乎是Alexey建议的一个编译器错误
Kotlin bug tracer上发布了一条信息。“如果您可以提供一个支持字段,则无需初始化该字段。”相反。如果属性有支持字段,则需要对其进行初始化;如果没有,就没有什么需要初始化的。我不认为这是关于支持字段的。我添加了第二个示例,该示例与有问题的代码几乎相同,但仍然有效。Java需要初始化字段,就像Kotlin所做的那样。不过,初始化之前的值可能不同,但我看不出它与这种情况有什么关系。@Watu是的,因为编译中的示例(以及if(true){throw Exception()}
),这不是问题所在。可能只是一个编译器错误。
class Foo {
private val a: Int
get() = getValue()
}
fun getValue():Int {
throw Exception()
}
fun main() {
Foo()
}