【问题标题】:What causes a NullPointerException during finalize() of a FileInputStream in Android?在 Android 中 FileInputStream 的 finalize() 期间导致 NullPointerException 的原因是什么?
【发布时间】:2011-11-16 12:36:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: android nullpointerexception fileinputstream


    【解决方案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!
    }
    

    【讨论】:

    • 我打电话给close()——这似乎是在流初始化不正确时发生的。但是,这不只是将 NPE 转移到我调用 close() 的方法吗?也感谢关于文件存在的提示:)
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多