0

我正在将我们的应用程序从使用外部文件(使用文件名访问)转换为内部文件(使用FileInputStreamFileOutputStream对象访问)。但是,我遇到了一个相当奇怪的错误:在 s 上finalize()FileInputStreams 有时会抛出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)

查看docjar.com上的FileInputStream 源,这似乎可能是由 null 引起的FileDescriptor;但是,我希望能够将错误的文件名传递给我的FileInputStream构造函数并捕获FileNotFoundException,因为这是我对 Android 内部系统所能做的一切(没有根据 中的每个条目测量文件名Context#fileList())。有没有办法解决这个问题?

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

4

1 回答 1

1

您应该在流上手动调用 close ,因为不保证会调用 finalize 。在这种情况下(除非 closeLock 在调用 finalize 之前为空)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!
}
于 2011-11-16T13:14:17.937 回答