无法在init块中访问它

时间:2019-07-28 13:59:18

标签: android kotlin

我是Kotlin的新手。initthis中是否存在并且具有正确的类型,但是当我尝试访问它时,它将引发空指针异常?

class GameGLSurface(context: Context,attrs:AttributeSet): GLSurfaceView(context,attrs) {
    val renderer:GLRenderer= GLRenderer(context,this)
    init {
        println("surface exists:${this!=null},${this is GLSurfaceView}")// says true,true
        this.renderMode= RENDERMODE_CONTINUOUSLY //throws NPE
        setRenderer(renderer)
    }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto" 
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    <GameGLSurface 
             android:layout_width="match_parent"                            
             android:layout_height="match_parent"                                                                                         
             android:id="@+id/gl_surface"/>
</FrameLayout>

2 个答案:

答案 0 :(得分:2)

您必须先设置渲染器:

class GameGLSurface(context: Context,attrs:AttributeSet): GLSurfaceView(context,attrs) {
    val renderer:GLRenderer= GLRenderer(context,this)
    init {
        println("surface exists:${this!=null},${this is GLSurfaceView}")// says true,true
        setRenderer(renderer)
        this.renderMode= RENDERMODE_CONTINUOUSLY //throws NPE
    }
}

应该工作

答案 1 :(得分:0)

不是由于未创建GlSurface而导致NPE,而是由于尚未设置渲染器,因此未创建更新曲面的线程。 解决方案是先设置渲染器,然后更改renderMode

init {
        setRenderer(renderer)
        renderMode= RENDERMODE_CONTINUOUSLY
    }

严重错误