5

我写了一个程序来查找文件或目录。当我尝试在目录 示例
中搜索文件时,它可以正常工作 但是当我尝试从本地驱动器搜索文件时,程序 在显示所有搜索结果后抛出异常 NullPointerException。

java FileSearch abc.txt f:\xyz

java FileSearch abc.txt f:\

空指针异常

代码是:

import java.io.*;
class FileSearch{
static String fd;
static boolean flg=true;
public static void main(String arr[]){
    fd=arr[0];
    String path=arr[1];
    String dir[]=new File(path).list();
    new FileSearch().finder(dir,path);
    if(flg){System.out.print("File not found.");}
}
public void finder(String[] dir,String path){
    for(int i=0;i<dir.length;i++){
        if(dir[i].equals(fd)){
            System.out.println(path+"\\"+fd);
            flg=false;
        }
        if(new File(path,dir[i]).isDirectory())
            finder(new File(path,dir[i]).list(),path+"\\"+dir[i]);
    }   
}
}

我想知道为什么会抛出这个异常以及如何修复它。

4

3 回答 3

10

列表()

文档中提到, 如果此抽象路径名不表示目录,或者发生 I/O 错误listFiles(),它将返回。null此外,您需要检查 file.canRead()应用程序是否可以读取目录。

恕我直言

始终以这种方式使用它;

String[] files = file.list();
if (files!=null) {
    for (String f : files) processFile(f);
}

推荐这个;

File directory = new File(directoryName);

//get all the files from a directory
File[] fList = directory.listFiles();

if(fList != null){
    for (File file : fList){
        if (file.isFile()){
            System.out.println(file.getName());
        }
    }
}

如果您有任何问题,请告诉我。

于 2013-09-13T20:54:16.953 回答
3

另一种选择是使用 JDK7 中引入的 FileVisitor 接口来执行搜索。http://docs.oracle.com/javase/tutorial/essential/io/walk.html上的链接提供了有关如何使用 FileVisitor 界面的详细信息。

以下代码块是搜索的重新实现,除了普通目录之外,它还应该能够在 Windows 驱动器级别列出文件。请注意,该实现使用作为 NIO 2 文件 IO 操作的一部分提供的 Files.walkTree 方法。

public class FileSearch {
    static String fd;
    static boolean flg = true;

    static class FileSearchVisitor extends SimpleFileVisitor<Path> {

        private final Path pathToSearch;

        boolean found;

        FileSearchVisitor(Path pathToSearch) {
            found = false;
            this.pathToSearch = pathToSearch;
        }

        public boolean isFound() {
            return found;
        }

        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            super.preVisitDirectory(dir, attrs);
            if (pathToSearch.getFileName().equals(dir.getFileName())) {
                System.out.println("Found " + pathToSearch);
                found = true;
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            super.visitFile(file, attrs);
            if (pathToSearch.getFileName().equals(file.getFileName())) {
                System.out.println("Found " + pathToSearch);
                found = true;
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) {
            System.err.println("Visit failed for file at path : " + file);
            exc.printStackTrace();
            return FileVisitResult.CONTINUE;
        }

    }

    public static void main(String arr[]) throws Exception {
        fd = arr[0];
        String path = arr[1];

        final Path searchFile = Paths.get(fd);
        Path filePath = Paths.get(path);
        FileSearchVisitor visitor = new FileSearchVisitor(searchFile);
        Files.walkFileTree(filePath, visitor);
        if (!visitor.isFound()) {
            System.out.print("File not found.");
        }
    }
}
于 2013-09-18T19:36:38.883 回答
0

这是你修复它的方法:

import java.io.*;
class FileSearch{
static String fd;
static boolean flg=true;
public static void main(String arr[]){
    fd=arr[0];
    String path=arr[1];
    String dir[]=new File(path).list();
    new FileSearch().finder(dir,path);
    if(flg){System.out.print("File not found.");}
}
public void finder(String[] dir,String path){
    if(dir == null){
        return;
    }
    for(int i=0;i<dir.length;i++){
        if(dir[i].equals(fd)){
            System.out.println(path+"\\"+fd);
            flg=false;
        }
        if(new File(path,dir[i]).isDirectory())
            finder(new File(path,dir[i]).list(),path+"\\"+dir[i]);
    }   
}
}

为什么?String dir[]=new File(path).list(); 在您指定的目录上为空,因此当您调用 dir.length 时,您将获得空指针异常

另一件事可以帮助您理解 System.out.print(new File(path).isDirectory()); 如果它是假的,那么你会得到空指针异常。

于 2013-09-21T02:34:29.350 回答