2010-07-26 10 views
5

Pracuję nad tym programem, aby uzyskać wszystkie pliki w katalogu. Z jakiegoś powodu otrzymuję NullPointerException na linii 16. Nie wiem dlaczego, ponieważ jest to szablon, który wydawał się działać w klasie z naszym nauczycielem. Dzięki.Program do pobierania wszystkich plików w katalogu w Javie

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

public class FindDirectories { 
    public static void main(String[] args) { 
     if (args.length == 0) { 
      args = new String[] { ".." }; 
     } 

     List<String> nextDir = new ArrayList<String>(); 
     nextDir.add(args[0]); // either the one file, or the directory 
     try { 
      while(nextDir.size() > 0) {  // size() is num of elements in List 
       File pathName = new File(nextDir.get(0)); // gets the element at the index of the List 
       String[] fileNames = pathName.list(); // lists all files in the directory 
       for(int i = 0; i < fileNames.length; i++) { 
        File f = new File(pathName.getPath(), fileNames[i]); // getPath converts abstract path to path in String, 
                    // constructor creates new File object with fileName name 
        if (f.isDirectory()) { 
        System.out.println(f.getCanonicalPath()); 
        nextDir.add(f.getPath()); 
        } 
        else { 
         System.out.println(f); 
        } 
       } 
       nextDir.remove(0); 
      } 
     } 
     catch(IOException e) { 
      e.printStackTrace(); 
     }  
    } 
} 

Odpowiedz

9

Zapoznaj się z Javadoc for File.list(). W szczególności:

Zwraca wartość null, jeśli ta abstrakcyjna ścieżka nie wskazuje katalogu lub wystąpi błąd we/wy.

W kodzie pathName.list(); należy powrocie zerowy tak pathName nie reprezentuje poprawny katalog lub błąd IO podczas próby uzyskać listę plików z tego katalogu.

+0

jak mogę to sprawdzić? Czy mogę po prostu powiedzieć pathName.list()! = null? – Crystal

+0

Tak @ Crystal, powinieneś to sprawdzić. Następnie zdecyduj, co zrobić, gdy to się stanie: zgłoś błąd, zapytaj użytkownika o poprawny katalog itp. – krock

0

Jeśli otrzymujesz wyjątek NullPointerException na linii 16, musi to oznaczać, że fileNames ma wartość null, więc fileNames.length jest nieprawidłowy. Spójrz na the javadoc for File.list, a zobaczysz, że pathName.list() może mieć wartość null, jeśli pathName nie jest katalogiem lub występuje wyjątek. Musisz więc sprawdzić, czy fileNames ma wartość NULL, zanim spróbujesz go użyć.

0
import java.io.File; 
import java.util.ArrayList; 
import java.util.LinkedList; 


public class FileEnumerator { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 

     // Prepare the List of files 
     String path = "C:/"; 
     ArrayList<String> Files = new ArrayList<String>(); 
     LinkedList<String> Dir = new LinkedList<String>(); 
     File f = new File(path); 
     Dir.add(f.getAbsolutePath()); 
     while(!Dir.isEmpty()) 
     { 
      f = new File(Dir.pop()); 
      if(f.isFile()) 
      { 
       Files.add(f.getAbsolutePath()); 
      } 
      else 
      { 
       String arr[] = f.list(); 
       try 
       { 
       for(int i = 0;i<arr.length;i++) 
       { 
        Dir.add(f.getAbsolutePath()+"/"+arr[i]); 
       } 
       } 
       catch(NullPointerException exp) 
       { 
        Dir.remove(f.getAbsoluteFile()); 
       } 
      } 
     } 


       //Print the files 
     for(int i = 0;i<Files.size();i++) 
     { 
      System.out.println(Files.get(i)); 
     } 
    } 

} 

Myślę, że ten kod powinien działać dobrze. Chociaż testowałem to tylko w systemie Windows. Ale inne systemy operacyjne będą wymagać co najwyżej niewielkich zmian.

+0

"Myślę, że ten kod powinien działać dobrze, chociaż przetestowałem go tylko w systemie Windows, ale inny system operacyjny będzie wymagał co najmniej niewielkich zmian." Biorąc pod uwagę, że dobry kod Java powinien działać w innym systemie operacyjnym z ** no ** zmianami, kod w twojej odpowiedzi jest * nie * dobrym przykładem. Przynajmniej powinien używać albo 'System.getProperty (" file.separator ")' albo konstruktora 'File', który akceptuje argumenty path/name zamiast'/'. Wtedy moglibyśmy użyć obiektów 'String' do reprezentowania' File's. Zakładając dysk 'C:', zamiast akceptować argument wiersza poleceń. (...) –

4

Zastosowanie poniżej fragment kodu, aby uzyskać wszystkie pliki z wszystkich katalogów podrzędnych:

import java.io.File; 

/** 
* 
* @author santoshk 
*/ 
public class ListFiles { 

    File mainFolder = new File("F:\\personal"); 
    public static void main(String[] args) 
    { 
     ListFiles lf = new ListFiles(); 
     lf.getFiles(lf.mainFolder); 
    } 
    public void getFiles(File f){ 
     File files[]; 
     if(f.isFile()) 
      System.out.println(f.getAbsolutePath()); 
     else{ 
      files = f.listFiles(); 
      for (int i = 0; i < files.length; i++) { 
       getFiles(files[i]); 
      } 
     } 
    } 
} 
0
import java.io.*; 

public class filedir 
{ 
    public static void main(String[] args) 
    { 
     try{ 
      Files f = new File("C:\\");//the path required 
      String a[]; 
      a=f.list(); 
      for (int i = 0; i <a.length; i++) { 
       System.out.println(a[i]); 
       } 
     } catch(Exception e) { 
      System.err.println(e); 
     } 
    } 
} 
+1

Mam nadzieję, że zrozumiesz ten mały kod ... przepraszam, jeśli to nie była odpowiedź na pytanie. – anjuna

Powiązane problemy