2011-09-17 111 views
2

我有被傳遞到一個輸入源的InputStream:關閉的InputStream

int resID = getResources().getIdentifier("c" + getCfrFile(), "raw", getPackageName()); 
InputStream ins = getResources().openRawResource(resID); 
InputSource xmlSource = new InputSource(ins); 

xmlTableRowLoader = new AcmTableRowLoader(handler, xmlSource, this, pathBuilder(false), "title"); 

如何正確地關閉()InputStream的?當我嘗試關閉它:

ins.Close(); 

我得到一個顯示java.lang.NullPointerException由於流被關閉前的「xmlSource」與它完成。此外,對象「xmlTableRowLoader」擴展了Thread。

+0

「AcmTableRowLoader」是什麼?你有javadoc嗎?它對它對InputSource參數的處理有什麼意義? –

回答

1

這取決於AcmTableRowLoader如何使用它。如果它只是在它的構造函數中使用它,我從你所說的內容中懷疑,那麼在上面的方法中關閉它可能是有效的。然而,由於看起來AcmTableRowLoader在構造函數以外的地方使用它,所以我建議讓AcmTableRowLoader創建並關閉流本身,因爲它知道它何時完成。

或者簡而言之,關閉xmlSource後關閉它。很難確切地知道在哪裏/如何沒有更多的上下文。看起來你剛剛跳過槍。

0

嘗試關閉從中讀取的線程中的流,當parse()返回時流可以關閉。 如果你想關閉另一個線程中的流,你可以看看AsyncTask。

+1

從討論中可以看出,** **正在導致** xmlStream **中的NPE。不是** ins **是空的。 –

+0

哦,我的壞,我編輯了我的答案。 – Michele

0

最佳做法是將整個代碼放入try{ ... }catch塊中,並添加一個finally塊,您應該關閉輸入流。

相關問題