[英]Caused by: java.lang.NullPointerException: lock == null
[英]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
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
目錄下,該目錄與java
和res
文件夾位於目錄層次結構中的同一級別。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.