在超类的初始化中使用variables时,重写variables会创建一个NPE

假设我们有以下设置:

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中使用时,它并不指向它,而是指向Bar类中的重写variables。 我怎样才能避免这一点?

One Solution collect form web for “在超类的初始化中使用variables时,重写variables会创建一个NPE”

这种行为是由img的getter被覆盖并返回不同字段的值(因为Bar用不同的types覆盖img ,它需要创建一个BufferedImagetypes的附加字段)的事实造成的。 Foo构造函数在Bar分配字段之前执行。

一般来说,你应该避免在你的类的初始化逻辑中使用打开的成员,因为它们可能在子类中被覆盖,并且可能依赖于在超类初始化的时候还没有正确初始化的状态。

对于你的具体情况,在Foo构造函数中创建一个简单的参数,并明确地使用该参数:

 open class Foo(img: Image) { open val img = img val use = img.graphics } 
  • 在KOTLIN中使用Replace函数
  • 使用okHTTP和GSON从API中提取数据
  • 如何在Kotlin中列出字段注释?
  • ArrayList,IntArray和Array 不同之处
  • 使用JUnit运行时,Intellij IDEA不会停止在Kotlin断点处
  • kotlin原生未知主机目标
  • 如何配置一个eclipse项目来使用Kotlin和JPA / Hibernate?
  • 在Kotlin安装和Getters
  • 如何在Kotlin中“锁定”静态对象
  • 如何从Kotlin的Javatypes数组中获取javaclass?
  • Kotlin - 函数的调用操作符重载
  • Kotlin language will be the best programming language for Android.