2011-03-28 39 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卡不可用(可能是因爲你的手機連接到電腦,調試?)

我也曾有過類似的錯誤之前,這就是爲什麼的原因。