2011-11-16 47 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()'的方法吗?也感谢关于文件存在的提示:) –

相关问题