2011-03-28 3 views
0

J'essaie d'obtenir récursive une structure de répertoire en Java, sur un émulateur Android, avec ce que je pense est un peu assez simple de code:Java/Android fichier récursive NullPointerException

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]); 
     } 
    } 
} 

Il fonctionne bien (jusqu'à présent) à moins que je l'exécute à la racine de la carte SD de l'émulateur, à quel point il jette une exception de pointeur nul. LogCat prétend qu'il est lancé lorsque la méthode s'appelle elle-même, mais je dois envelopper toute la boucle for dans un bloc try/catch afin d'attraper l'exception. J'ai essayé environ une demi-douzaine de permutations sur le même type de thème, et ce qui précède est le plus fade et le plus sûr que je puisse trouver, mais ils jettent tous cette erreur. Je suis soit en train de faire quelque chose de stupide, ou il y a un objet étrange qui se cache dans la racine de la carte SD de l'émulateur qui rapporte comme un répertoire mais retourne une valeur fausse avec .listFiles(). Cela .android_security semble certainement un peu shifty.

Quelqu'un aurait-il l'amabilité de me dire lequel, si l'un d'entre eux, est?

+2

D'autres ont répondu à la question (vérification nulle), mais voici la raison. 'File.listFiles()' retournera null (par opposition à un tableau vide) s'il ne peut pas lister les fichiers pour une raison quelconque. Un exemple pourrait être les autorisations de sécurité interdisent, un autre pourrait être un lien symbolique invalide. Pour une raison quelconque, cela ne jette pas 'java.io.IOException' malgré le fait que d'autres méthodes de la classe le font dans des situations similaires. –

Répondre

3

Je serais plus défensif et d'écrire cette façon:

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]); 
      } 
     } 
    } 
} 

Intéressant: Est-ce que la classe Log vous, ou est-ce une solution d'exploitation forestière qui est couramment utilisé sur Android?

+0

* Très * couramment utilisé. Détails [ici] (http://developer.android.com/reference/android/util/Log.html). –

+0

Un peu d'expérimentation révèle qu'il y a en effet un objet caché sur la racine de la carte SD (.android_security) qui renvoie true pour isDirectory() mais qui apparaît partout quand vous appelez .listFiles() dessus. Je pense que je vais probablement le conditionner à l'écran à la fois pour les objets nuls et cachés. Merci. –

1

Vous pourriez obtenir null pointer exceptions parce que la carte SD est indisponible (peut-être parce que votre téléphone est connecté à votre PC pendant le débogage?)

J'ai eu une erreur semblable avant et qui était la raison pour laquelle.