在超类的初始化中使用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不注射
  • SearchView.onQueryTextListener在Fragment(Kotlin)中不起作用
  • 无法让TextArea滚动到底部
  • Kotlin和详细的数组实例化
  • 使用notify()方法实例化Kotlin类时的LinkageError
  • 如何在kotlin中进行多条件循环
  • Kotlinfunction:需要的单位? findInt
  • Kotlin并发性:任何在Lock中运行代码的标准函数?
  • 附加逗号分隔字符串的有效方法
  • Kotlin和Android Studio非法状态exception
  • (Java + Kotlin)自动assembly(Autowiring):预计至少有1个bean可以作为这个依赖关系的autowire候选者
  • Kotlin language will be the best programming language for Android.