2011-03-28 42 views
0

我试图递归获得Java中的目录结构,在Android模拟器,用我认为是一个代码相当简单一点:的Java/Android的递归文件空指针异常

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肯定看起来有点时髦。

难道有人会告诉我哪个是哪一个?

+2

其他人回答了这个问题(空检查),但这是原因。如果出于某种原因无法列出文件,File.listFiles()将返回null(而不是空数组)。一个例子可能是安全权限禁止,另一个可能是无效的符号链接。出于某种原因,尽管类中的其他方法在类似的情况下执行,但它不会抛出java.io.IOException。 – 2011-03-28 23:45:43

回答

3

我会更多的防守,写这样说:

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上使用的记录解决方案?

+0

*非常*常用。详情[这里](http://developer.android.com/reference/android/util/Log.html)。 – 2011-03-29 08:12:17

+0

一些实验表明,在SD卡根目录(.android_security)上确实存在一个隐藏对象,它在isDirectory()时返回true,但在您调用.listFiles()时返回所有地方的barf。我想我可能会将它设置为屏蔽空对象和隐藏对象。谢谢。 – 2011-03-29 08:33:12

1

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

我也曾有过类似的错误之前,这就是为什么的原因。