【问题标题】:Java/Android recursive file null pointer exceptionJava/Android递归文件空指针异常
【发布时间】:2011-03-28 23:34:57
【问题描述】:

我正在尝试在 Android 模拟器上以 Java 递归获取目录结构,我认为这是一段相当简单的代码:

public void list(File file) 
{
    if(file.isDirectory())
    {
       File[] children = file.listFiles();
       for(int i = 0; i < children.length; i++)
       {
           Log.d(TAG, children[i].getName());
           list(children[i]);
       }
    }
}

除非我在模拟器的 SD 卡的根目录中运行它,否则它工作正常(到目前为止),此时它会引发空指针异常。 LogCat 声称它是在方法调用自身时抛出的,但我必须将整个 for 循环包装在 try/catch 块中才能捕获异常。

我在同一主题上尝试了大约六种排列,以上是我能想到的最平淡和最安全的排列,但它们都抛出了这个错误。我要么在做一些愚蠢的事情,要么在模拟器的 SD 卡的根目录中潜伏着一个奇怪的对象,它报告为一个目录,但使用 .listFiles() 返回一个虚假值。那个 .android_security 看起来确实有点诡异。

谁能告诉我是哪一个?

【问题讨论】:

  • 其他人回答了这个问题(空检查),但这就是原因。 File.listFiles() 如果由于某种原因无法列出文件,将返回 null(而不是空数组)。一个例子可能是安全权限禁止它,另一个可能是无效的符号链接。出于某种原因,这不会抛出java.io.IOException,尽管类上的其他方法在类似情况下也会这样做。

标签: java android recursion


【解决方案1】:

我会更加防御并这样写:

public void list(File file) 
{
    if (file != null && file.isDirectory())
    {
       File[] children = file.listFiles();
       if (children != null)
       {
           for(int i = 0; i < children.length; i++)
           {
               if (children[i] != null)
               {
                   Log.d(TAG, children[i].getName());
               }
               list(children[i]);
           }
        }
    }
}

有趣:这个 Log 类是你的,还是 Android 上常用的日志记录解决方案?

【讨论】:

  • 非常常用。详情here.
  • 一些实验表明,在 SD 卡根 (.android_security) 上确实有一个隐藏对象,它为 isDirectory() 返回 true,但是当你调用 .listFiles() 时,到处都是 barfs它。我想我可能会对其进行条件化以筛选空对象和隐藏对象。谢谢。
【解决方案2】:

您可能会收到null pointer exceptions,因为 SD 卡不可用(可能是因为您的手机在调试时连接到您的电脑?)

我之前也遇到过类似的错误,这就是原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多