2011-03-14 18 views
0

안녕 여기에 명령 줄에서 디렉토리를 가져 와서이 디렉토리와 그 하위 폴더에있는 모든 파일을 추가하는 작은 프로그램이 있습니다. 코드는파일을 읽을 때 java.lang.NullPointerException이 발생했습니다.

입니다.
package oop.ex1.filescript; 

import java.io.*; 
import java.util.ArrayList; 

public class MyFileScript { 

public static void main(String[] args) { 

    File dir = new File(args[0]); 
    //LINE 13 
    ArrayList<File> files = readAllFiles(dir.listFiles()); 

} 

private static ArrayList<File> readAllFiles(File[] dir){ 

    ArrayList<File> result = new ArrayList<File>(); 
      //LINE 28 
    for(File itr : dir) { 
     result.add(itr); 
     if (!itr.isFile()) { 
      File[] temp = itr.listFiles(); 
          //LINE 32 
      ArrayList<File> deeperList = readAllFiles(temp); 
      result.addAll(deeperList); 
     } 
    } 
    return result; 

} 

} 지금은 모든 것이 괜찮 그들에 많은 파일이 아닌와 특정 폴더에서 실행,하지만 난 피드 때 내가 얻을 수 많은 파일과 폴더 때

:

Exception in thread "main" java.lang.NullPointerException 
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:28) 
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32) 
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32) 
at oop.ex1.filescript.MyFileScript.main(MyFileScript.java:13) 

그 이유는 무엇입니까? 감사! p.s. 나는 줄 번호를 표시했다!

답변

0

이렇게하면됩니다. 테스트 할 때 잘 작동합니다.

public static List<File> getAllChildFiles(File[] dir) 
{ 

    List<File> result = new ArrayList<File>(); 
    for (File file : dir) 
    { 
     if (file.isDirectory()) 
     { 
      File[] children = file.listFiles(); 
      List<File> grandChildren = getAllChildFiles(children); 
      result.addAll(grandChildren); 
     } 
     else 
     { 
      result.add(file); 
     } 
    } 

    return result; 
} 
+0

안녕하세요, 목록은 ArrayList에 비해 어떤 이점이 있습니까? – yotamoo

+0

인터페이스에 대한 디자인 - 아이디어를 들어 본 적이 없습니까? 클래스의 구체적인 유형을 광고하지 않으므로 클라이언트를 변경하면 클라이언트가 영향을받지 않습니다. java.sql 패키지를 보라. 중요한 클래스는 모두 인터페이스이다. 왜 그런지 생각해? – duffymo

2

라인 28의 dir 변수는 아마도 null입니다. 에 전화하기 전에 dir.listFiles()의 결과에 대한 점검을 포함 할 수 있습니다.

3

dir.listFiles처럼 보입니다. null입니다.

"이 추상 패스 명이 디렉토리를 나타내지 않는 경우, 또는 입출력 에러가 발생했을 경우는 null를 돌려줍니다. 대신

if (!itr.isFile()) { 

사용 그것은 굳이 용 디렉토리가 아닌 파일이없는 경우

if (itr.isDirectory()) { 

1

.

+0

알아두면 좋은 점은 무엇입니까? – yotamoo

+0

@yotamoo 장치 드라이버, 명명 된 파이프 등 -하지만 이것이 사실이 아니더라도 디렉토리가 있는지 테스트하고 싶을 때'isDirectory()'를 사용하지 않는 이유는 무엇입니까? – vbence

0

if (itr.isDirectory())을 수행하고 null if (tmp != null)을 확인해야합니다.

0

나는 listFile(FileFilter)을 사용하고 FileFilterFile.canRead()으로 반환합니다. 모든 예상 파일을 얻었는지 확인하고, 왜 읽을 수 없는지 알아 내지 않으면보십시오.

관련 문제