2013-12-10 92 views
0

爲什麼我的應用程序崩潰?它崩潰在fis.close();線上。 這是一個AsyncTaskdoInBackground方法。FileInputStream崩潰.close()NPE

String collected = null; 
    FileInputStream fis = null; 
    try { 
     fis = openFileInput(FILENAME); 
     byte[] dataArray = new byte[fis.available()]; 
     while (fis.read(dataArray) != -1) { 
      collected = new String(dataArray); 
     } 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     try { 
      fis.close(); 
      return collected; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

-

12-10 14:12:47.431: E/AndroidRuntime(701): FATAL EXCEPTION: AsyncTask #1 
12-10 14:12:47.431: E/AndroidRuntime(701): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-10 14:12:47.431: E/AndroidRuntime(701): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
12-10 14:12:47.431: E/AndroidRuntime(701): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.lang.Thread.run(Thread.java:856) 
12-10 14:12:47.431: E/AndroidRuntime(701): Caused by: java.lang.NullPointerException 
12-10 14:12:47.431: E/AndroidRuntime(701): at com.ollygrov.doughpro.CustomRecipe$loadDatas.doInBackground(CustomRecipe.java:471) 
12-10 14:12:47.431: E/AndroidRuntime(701): at com.ollygrov.doughpro.CustomRecipe$loadDatas.doInBackground(CustomRecipe.java:1) 
12-10 14:12:47.431: E/AndroidRuntime(701): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
12-10 14:12:47.431: E/AndroidRuntime(701): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

回答

1

很可能是openFileInput(FILENAME);拋出異常。 這意味着您正試圖關閉null流。 在關閉InputStream之前檢查null

+0

感謝您的快速回復,我以前使用FileOutputStream保存了一個文件,並且試圖回想那個保存的文件。兩者都是相同的字符串。難道這個文件最初從來沒有保存過嗎?在完成工作後,我將不得不深入研究這個問題,我會盡快回復您 – Ollygrov

+0

只需看看您遇到的異常情況。 –

+0

確定添加了一個空檢查器,它是一個空流。它爲什麼這樣做? FILENAME不爲空它是一個字符串,並且在保存方法中似乎創建了一個文件 – Ollygrov

1

有沒有機會openFileInput退貨null?在這種情況下,NullPointerException將在byte[] dataArray = new byte[fis.available()];處被無聲吞嚥。

執行將跳轉到finally塊,其中將拋出異常,因爲在catch塊中沒有處理該塊。

+0

謝謝,這爲fis的過程提供了一些啓示。我會盡快再次檢查並回復你。乾杯 – Ollygrov

+1

我會建議使用類似Apache Commons IO的'IOUtils.closeSilently()'。它基本上會關閉任何IO流而不會拋出異常。 – CodeChimp