2013-09-12 2 views
0

Я читаю файл .OBJ, который находится в папке с активами. Но при чтении файла я получаю исключение. Даже я отлаживаю проект на затмении, но я могу найти причину этого.Исключение: вызвано: java.lang.NullPointerException: актив

Помогите мне

Заранее благодарен.

/** 
* 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; 
     } 
    } 
} 

Трассировка Ошибка

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 
+0

ошибка находится в native assetManager, что означает, что актив открывается в порядке, но после этого возникает проблема. Чтобы определить проблему с большей точностью, я предлагаю вам сделать очень простое приложение, которое только считывает файл из активов. Это скажет вам, есть ли проблема с самим файлом. – njzk2

+0

Я использовал тот же файл в другом проекте. Он работал в этом проекте. –

+0

что такое 'localContext'. Может быть, из-за getAsset() возвращает null. и когда вы открываете объект «null» (т. е. обращаетесь к нулевому объекту), возникает исключение NPE. – guptakvgaurav

ответ

2

Я думаю, что вы ошибаетесь с смыслом continue ключевого слова. Это ключевое слово означает, что цикл сразу переходит к следующей итерации без выполнения остальной части кода в блоке цикла.

В вашем случае, это означает, что этот код

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

закрывает InputStream, а затем пытается читать из него. Вы не очень понятны, потому что все продолжается, поэтому я не могу сказать вам, как это исправить.

0
@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); 
     } 
    } 

пожалуйста, проверьте это ...

+1

не имеет значения. нет правила для доступа к активам из потока или другого. – njzk2

+0

Все еще имея такую ​​же проблему. @ njzk2 Любой способ для этого –

0

начать с

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

так, вы закрываете поток и после того, что вы пытаетесь снова читать из него. Также вы запускаете это внутри бесконечного цикла и выходите из него только в разделе catch. Подумайте о закрытии потока после того, как вы закончите читать его.

Смежные вопросы