2011-03-28 2 views
0

재귀 파일 널 포인터 예외 :자바/안드로이드 내가 코드를 매우 간단 비트 무슨 생각으로, 안드로이드 에뮬레이터에서, 반복적으로 자바에서 디렉토리 구조를 얻으려고

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 카드의 루트에서 실행하지 않는 한 괜찮습니다 (지금까지), 어느 지점에서 null 포인터 예외가 발생합니다. LogCat은 메소드가 스스로를 호출 할 때 발생한다고 주장하지만 예외를 잡으려고 try/catch 블록에서 전체 for 루프를 래핑해야합니다.

같은 종류의 주제에 대해 약 6 가지 순열을 시도했는데 위의 것은 내가 생각할 수있는 가장 부드럽고 안전하지만 모두이 오류를 던집니다. 나는 어리석은 짓을하고 있거나 에뮬레이터의 SD 카드의 루트에 숨어있는 이상한 객체가있다.이 객체는 디렉토리로보고되지만 .listFiles()로 가짜 값을 반환한다. 그건. android_security 확실히 조금 교대 보인다.

아무도 나에게 말하면 어떤 친절한 사람이 있겠습니까?

+2

다른 사람이 질문에 답변했습니다 (null 체크). 그러나 여기에는 이유가 있습니다. 'File.listFiles()'는 어떤 이유로 파일을 나열 할 수없는 경우 null을 반환합니다 (빈 배열과 반대). 한 가지 예는 보안 사용 권한이이를 금지하고 다른 하나가 유효하지 않은 심볼릭 링크 일 수 있습니다. 어떤 이유로 클래스의 다른 메소드가 유사한 상황에서 수행한다는 사실에도 불구하고 java.io.IOException을 throw하지 않습니다. –

답변

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

재미있는 : 그 로그 클래스 당신인가, 또는입니다 일반적으로 안드로이드에 사용되는 로깅 솔루션?

+0

* Very * 일반적으로 사용됩니다. 세부 정보 [here] (http://developer.android.com/reference/android/util/Log.html). –

+0

약간의 실험을 통해 실제로 SD 카드 루트 (.android_security)에 숨겨진 개체가 있다는 것을 알 수 있습니다.이 개체는 isDirectory()에 대해 true를 반환하지만 .listFiles()를 호출하면 모든 곳에서 금지됩니다. 아마 null 객체와 숨겨진 객체를 화면에 표시하기 위해 조건부로 처리 할 것입니다. 감사. –

1

SD 카드를 사용할 수 없기 때문에 당신은 null pointer exceptions을 받고 수 (디버깅하는 동안 휴대 전화가 PC에 연결되어 어쩌면 때문에?)

내가 전에 비슷한 오류를 했어 그 이유였다.

관련 문제