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 当在超类的初始化中使用变量时,重写变量将创建NPE_Kotlin - Fatal编程技术网

Kotlin 当在超类的初始化中使用变量时,重写变量将创建NPE

Kotlin 当在超类的初始化中使用变量时,重写变量将创建NPE,kotlin,Kotlin,假设我们有以下设置: open class Foo(open val img: Image) { val use = img.graphics } class Bar(override val img: BufferedImage) : Foo(img) 初始化时,使用img.width创建NPE。我认为问题在于,显然,即使img直接在Bar中传递到Foo的构造函数中,当它在Foo中使用时,它并不指向它,而是指向Bar类中被重写的变量。如何避免这种情况?此行为是由以下事实引起的:img

假设我们有以下设置:

open class Foo(open val img: Image) {
    val use = img.graphics
}
class Bar(override val img: BufferedImage) : Foo(img)

初始化时,使用
img.width
创建NPE。我认为问题在于,显然,即使
img
直接在Bar中传递到Foo的构造函数中,当它在Foo中使用时,它并不指向它,而是指向Bar类中被重写的变量。如何避免这种情况?

此行为是由以下事实引起的:
img
的getter被重写,并返回不同字段的值(由于
Bar
使用不同类型重写
img
,因此需要创建类型为
BufferedImage
的附加字段)。
Foo
构造函数在
Bar
中指定该字段之前执行

通常,您应该避免在类的初始化逻辑中使用开放成员,因为它们可能在子类中被重写,并且可能依赖于某些状态,这些状态在超类初始化时尚未正确初始化

对于您的特定情况,将
Foo
构造函数中的
img
设置为一个简单参数,并明确使用该参数:

open class Foo(img: Image) {
    open val img = img
    val use = img.graphics
}