简体   繁体   English

异常:引起:java.lang.NullPointerException:asset

[英]Exception : Caused by: java.lang.NullPointerException: asset

I am reading the .OBJ file which is in asset folder. 我正在读取资产文件夹中的.OBJ文件。 But I am getting exception while reading the file. 但是我在阅读文件时遇到异常。 Even I debug the project on eclipse but I could find the reason for this. 即使我在Eclipse上调试项目,但我可以找到原因。

Please help me 请帮我

Thanks in advance. 提前致谢。

/**
 * Load Object Asynchronous.
 * @author Ajay
 */
private class ObjLoaderAsync extends AsyncTask<Void, Void, Void> {

    private ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        try {
            progressDialog = new ProgressDialog(localContext);
            progressDialog.setTitle(localContext
                    .getString(R.string.app_name));
            progressDialog.setMessage(localContext
                    .getString(R.string.please_wait));
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setCancelable(true);
            progressDialog.show();
        } catch (Exception e) {
        }
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            mr[getCurrentPosition()] = new ModelRenderer(localContext,
                    localContext.getAssets().open(RendererView.objName));
        } catch (java.io.IOException e) {
            Log.v("DemoRendererView", "loading model: " + e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void param) {
        try {
            progressDialog.cancel();
        } catch (Exception e) {

        }
    }
}

public ModelRenderer(Context paramContext, InputStream localFileInputStream) throws FileNotFoundException {
    ModelStaticClassTransfer.value = -777.0F;
    while (true) {
        try {
            i = localFileInputStream.read();
            if (i != -1)
                continue;
            localFileInputStream.close();
            if ((char) i == 'v') {
                i = localFileInputStream.read();
                if ((char) i != ' ')
                    continue;
                this.verticeCounter = (1 + this.verticeCounter);
                continue;
            }
            if ((char) i == 'f') {
                i = localFileInputStream.read();
                if ((char) i != ' ')
                    continue;
                this.indexCounter = (1 + this.indexCounter);
                continue;
            }
            int j = localFileInputStream.read();
            i = j;
        } catch (IOException localIOException) {
            localIOException.printStackTrace();
            return;
        }
    }
}

Error Trace 错误跟踪

09-12 12:54:57.516: E/AndroidRuntime(29949): FATAL EXCEPTION: AsyncTask #2
09-12 12:54:57.516: E/AndroidRuntime(29949): java.lang.RuntimeException: An error occured while executing doInBackground()
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.lang.Thread.run(Thread.java:856)
09-12 12:54:57.516: E/AndroidRuntime(29949): Caused by: java.lang.NullPointerException: asset
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.content.res.AssetManager.readAssetChar(Native Method)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.content.res.AssetManager.access$200(AssetManager.java:35)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:548)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at com.amplimesh.models.ModelRenderer.<init>(ModelRenderer.java:64)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at com.amplimesh.models.ModelGLRenderer$ObjLoaderAsync.doInBackground(ModelGLRenderer.java:138)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at com.amplimesh.models.ModelGLRenderer$ObjLoaderAsync.doInBackground(ModelGLRenderer.java:1)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-12 12:54:57.516: E/AndroidRuntime(29949):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-12 12:54:57.516: E/AndroidRuntime(29949):    ... 5 more

I think you are mistaken with the meaning of the continue keyword. 我认为你误解了continue关键字的含义。 This keyword means that the loop jumps immediately to the next iteration without executing the rest of the code in the loop block. 此关键字表示循环立即跳转到下一次迭代,而不执行循环块中的其余代码。

In your case, it means that this code 在您的情况下,它意味着这个代码

i = localFileInputStream.read();
if (i != -1)
    continue;
localFileInputStream.close();
if ((char) i == 'v') {
    i = localFileInputStream.read();

closes the inputStream, and then tries to read from it. 关闭inputStream,然后尝试从中读取。 You algorithm is not very clear because of all the continues, so I can't really tell you how to fix that. 因为所有的继续,你的算法不是很清楚,所以我不能真正告诉你如何解决这个问题。

 @Override
    protected void onPostExecute(Void param) {
        try {
            mr[getCurrentPosition()] = new ModelRenderer(localContext,
                    localContext.getAssets().open(RendererView.objName));
             dialog.cancle();
        } catch (java.io.IOException e) {
            Log.v("DemoRendererView", "loading model: " + e);
        }
    }

please check this... 请检查一下......

you start with 你开始

try {
        i = localFileInputStream.read();
        if (i != -1)
            continue;
        localFileInputStream.close();

so, you are closing the stream and after that you are trying to read again from it. 所以,你正在关闭流,然后你试图再次阅读它。 Also you are running this inside an infinite loop and exit from it only in a the catch section. 你也在无限循环内运行它,只在catch部分退出它。 Consider closing the stream after you are done reading it. 完成阅读后,请考虑关闭流。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM