2011-11-16 72 views
0

我正在將我們的應用程序從使用外部文件(使用文件名訪問)轉換爲內部文件(使用FileInputStreamFileOutputStream對象訪問)。但是,我收到了一個相當奇怪的錯誤:在finalize()上,FileInputStream有時投擲NullPointerException在Android的FileInputStream的finalize()期間導致NullPointerException的原因是什麼?

logcat的告訴我:

Uncaught exception thrown by finalizer (will be discarded): 
java.lang.NullPointerException: 
at java.io.FileInputStream.close(FileInputStream.java:133) 
at java.io.FileInputStream.finalize(FileInputStream.java:156) 
at dalvik.system.NativeStart.run(Native Method) 

望着FileInputStream source on docjar.com似乎有可能,這可能是一個空FileDescriptor原因;不過,我希望能夠將錯誤文件名傳遞給我的FileInputStream構造函數,並捕獲FileNotFoundException,因爲這是我可以使用Android內部系統完成的工作(對Context#fileList()中的每個條目測量文件名的次數很少)。有沒有辦法解決這個問題?

注意一個終結器中的異常並不會導致任何實際的崩潰,但我覺得我應該嘗試整理它。

回答

1

您應該手動調用關閉您的流,因爲finalize不保證被調用。在這種情況下(除非在調用finalize之前清零closeLock),NPE將被避免。

如果您使用的是Context.openFileInput/Output;你可以檢查文件是否存在通過:如果您使用AssetManager.open()

File f = new File(context.getFilesDir(), filename); 
if(!f.exists()) { 
    //ohnoes! 
} 

;我認爲你可以做這樣的事情:

File f = new File("file:///android_asset/" + filename); 
if(!f.exists()) { 
    //ohnoes! 
} 
+0

我打電話'close()' - 這似乎一直髮生在流不正確初始化時。但是,這不僅僅是將NPE轉移到我稱之爲'close()'的方法嗎?也感謝關於文件存在的提示:) –

相關問題