【发布时间】:2017-03-24 15:29:25
【问题描述】:
在我的一个程序中,我遇到了一个空异常并调试了代码,我发现这是因为我的 String array (java) 之一:
val FRAGMENTS = arrayOf("phong-lighting", "phong-only", "blinn-lighting", "blinn-only")
当我在连续的class method (java) 中需要它时尚未初始化:
fun initializePrograms(gl: GL3) {
programs = Array(LightingModel.MAX, {
ProgramPairs(
ProgramData(gl, "pn.vert", FRAGMENTS[it] + ".frag"),
ProgramData(gl, "pcn.vert", FRAGMENTS[it] + ".frag"))
})
unlit = UnlitProgData(gl, "pos-transform.vert", "uniform-color.frag")
}
如果我把它移到里面:
fun initializePrograms(gl: GL3) {
val FRAGMENTS = arrayOf("phong-lighting", "phong-only", "blinn-lighting", "blinn-only")
...
}
然后一切都很好..为什么?
Ps:同样的代码和同样的行为在 java 中也一样
编辑:不要混淆,init 不是class init,它扩展了Framework 方法here
Edit2:initializePrograms() 不会从超级构造函数中调用。它是从init(GL3 gl) 调用的,它覆盖Framework.init(GL3 gl) which gets called from Framework.init(GLAutoDrawable autoDrawable),它应该在开始时从Animator 调用一次,应该是另一个线程。
【问题讨论】:
-
不是在超级构造函数内部调用了类方法吗?如果是,那么原因是在属性初始化之前调用了超级构造函数。
-
是的,我认为并检查了它,但我认为它没有。这对我来说有点神秘。
-
我对Kotlin了解不多,能不能用关键字来识别变量,不管是私有的还是公有的,在方法之外,看看是否有效?
-
@hotkey 不,它不会。
initializePrograms()从init(GL3 gl)调用,它会覆盖从Framework.init(GLAutoDrawable autoDrawable)调用的Framework.init(GL3 gl),它应该从Animator调用一次在开始时应该是另一个线程。 -
@In-youngChoung,你可以看看并行的java代码(括号里有引用)
标签: java exception null kotlin