Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin &引用;属性必须初始化或是抽象的;引发异常时在init块中_Kotlin - Fatal编程技术网

Kotlin &引用;属性必须初始化或是抽象的;引发异常时在init块中

Kotlin &引用;属性必须初始化或是抽象的;引发异常时在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

为什么kotlin report
属性必须初始化或抽象。对象构造永远不会完成,因此无论
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()
}