在Android的FileInputStream的finalize()期间导致NullPointerException的原因是什么?

时间:2011-11-16 12:36:33

标签: android nullpointerexception fileinputstream

我正在将我们的应用程序从使用外部文件(使用文件名访问)转换为内部文件(使用FileInputStreamFileOutputStream对象访问)。但是,我收到了一个相当奇怪的错误:在finalize()上,FileInputStream有时会抛出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内部系统做的全部(不能测量{{1}中每个条目的文件名。 1}})。有没有办法解决这个问题?

NB显然终结器中的异常不会导致任何实际崩溃,但我觉得我应该尝试整理一下。

1 个答案:

答案 0 :(得分:1)

您应该在流上手动调用close,因为无法保证调用finalize。在这种情况下(除非在调用finalize之前将closeLock置为空),否则将避免使用NPE。

如果您正在使用Context.openFileInput / Output;您可以通过以下方式检查文件是否存在:

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

如果您正在使用AssetManager.open();我想你可以做点什么:

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