簡體   English   中英

java.lang.NullPointerException: lock == null 來自 InputStreamReader

[英]java.lang.NullPointerException: lock == null from InputStreamReader

所以我試圖解析一個 .obj 波前文件以使用 OpenGL ES 顯示,事情是,我得到 Nullpointer 就好像文件不存在或為空(?)。 我嘗試了兩種不同的方法來解析文件,還確保上面沒有空行,將它放在不同的文件夾中(資產、src 根、res 等),但結果是一樣的。 也許我得到的錯誤更多地與代碼的 OpenGL 部分有關? 但我有點迷路了,因為顯然它應該工作......還嘗試在 function 之外緩沖文件,同樣發生了。 從這里的另一個問題來看,這個人遇到的問題與“嘗試從工作線程更新 UI”有關。 異步在這里沒有幫助我。

我從這個博客中得到了代碼想法: http://etcodehome.blogspot.com/2011/07/android-rendering-3d-blender-models.html

以及我的工作基礎文件: https://github.com/MartianIsMe/earth-live-wallpaper/blob/d71902aa642bad0c10fc46d6839ced6e15995f7b/%20earth-live-wallpaper/SLWP/src/com/sathStar/SLWP/De java

 fun loadObjFile() {
    try {
        var str: String
        var tmp: Array<String>
        var ftmp: Array<String>
        var v: Float
        val vlist = ArrayList<Float>()
        val nlist = ArrayList<Float>()
        val fplist = ArrayList<Fp>()
        val mContext: Context? = null
        //val inb: BufferedReader = File("androidmodel.obj").bufferedReader()
        //val inputString = inb.use { it.readText() }
        val inb = BufferedReader(InputStreamReader(mContext?.getAssets()?.open
        ("src/main/res/androidmodel.obj")), 1024) //Error is here at com.example.xxx.MyGLRenderer.loadObjFile

        while (inb.readLine().also { str = it } != null) {
            tmp = str.split(" ".toRegex()).toTypedArray()
            //Parse the vertices
            if (tmp[0].equals("v", ignoreCase = true)) {
                for (i in 1..3) {
                    v = tmp[i].toFloat()
                    vlist.add(v)
                }
            }
            //Parse the vertex normals
            if (tmp[0].equals("vn", ignoreCase = true)) {
                for (i in 1..3) {
                    v = tmp[i].toFloat()
                    nlist.add(v)
                }
            }
            //Parse the faces/indices
            if (tmp[0].equals("f", ignoreCase = true)) {
                for (i in 1..3) {
                    ftmp = tmp[i].split("/".toRegex()).toTypedArray()
                    val chi = ftmp[0].toInt() - 1.toLong()
                    var cht = 0
                    if (ftmp[1] != "") cht = ftmp[1].toInt() - 1
                    val chn = ftmp[2].toInt() - 1
                    fplist.add(Fp(chi, cht, chn))
                }
                NBFACES++
            }
        }
        val vbb = ByteBuffer.allocateDirect(fplist.size * 4 * 3)
        vbb.order(ByteOrder.nativeOrder())
        mVertexBuffer = vbb.asFloatBuffer()
        val nbb = ByteBuffer.allocateDirect(fplist.size * 4 * 3)
        nbb.order(ByteOrder.nativeOrder())
        mNormBuffer = nbb.asFloatBuffer()
        for (j in fplist.indices) {
            mVertexBuffer?.put(vlist[(fplist[j].Vi * 3).toInt()])
            mVertexBuffer?.put(vlist[(fplist[j].Vi * 3 + 1).toInt()])
            mVertexBuffer?.put(vlist[(fplist[j].Vi * 3 + 2).toInt()])
            mNormBuffer?.put(nlist[fplist[j].Ni * 3])
            mNormBuffer?.put(nlist[fplist[j].Ni * 3 + 1])
            mNormBuffer?.put(nlist[fplist[j].Ni * 3 + 2])
        }
        mIndexBuffer = CharBuffer.allocate(fplist.size)
        for (j in fplist.indices) {
            mIndexBuffer?.put(j.toChar())
        }
        mVertexBuffer?.position(0)
        mNormBuffer?.position(0)
        mIndexBuffer?.position(0)
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

private class Fp
(var Vi: Long, var Ti: Int, var Ni: Int)

問題是您將null傳遞給InputStreamReader 資產路徑錯誤。

  • 首先,該文件應位於assets目錄下,該目錄與javares文件夾位於目錄層次結構中的同一級別。
  • 其次,您應該傳遞相對於assets目錄的路徑。 因此,如果您的文件直接位於assets下,則相對路徑為"androidmodel.obj" 因此,創建輸入 stream 將如下所示:
InputStreamReader(mContext?.getAssets()?.open("androidmodel.obj"))

但我強烈建議您檢查非空值,因為如果mContext是 null - 問題將返回。

mContext?.getAssets()?.open("androidmodel.obj")?.let { nonNullAsset ->
    InputStreamReader(nonNullAsset)
}

這部分是let?.let {

如果沒有assets目錄,只需創建一個簡單的目錄,它會被 IDE 自動拾取:

主目錄層次結構

更新

由於 NPE 仍然發生,剩下的唯一原因是mContext變量中的null值。 確保它已初始化。

經過更多的挖掘,我可以說這從一開始就是問題所在。 任何將文件的錯誤路徑傳遞給assets.open(fileName) function 的嘗試都將導致FileNotFoundException 因此,即使您使用的路徑是錯誤的,您甚至沒有達到打開文件的地步,因為上下文是 null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM