文件搜索时出现空指针异常

时间:2016-11-11 13:22:48

标签: java file search recursion

我正在编写代码,在我的计算机存储中搜索由起始路径指示的特定文件(或同名的多个文件),所有这些文件都是用户控制台输入的。我的代码似乎可以正常进行一些测试但是当我尝试使用更通用的目录(C:\ Users \ andy)来搜索文件时,我在下面得到了这个空指针异常。

Exception in thread "main" java.lang.NullPointerException
    at FindFile.search(FindFile.java:44)
    at FindFile.search(FindFile.java:48)
    at FindFile.search(FindFile.java:48)
    at FindFile.search(FindFile.java:48)
    at FindFile.directorySearch(FindFile.java:32)
    at Driver.main(Driver.java:33)

该程序在搜索我的C驱动器时运行了相当长的一段时间,但几秒钟后我就抛出了上面的异常。我完全失去了,任何帮助将不胜感激! (对不起,我是新来的)

44: for (File temp : filename.listFiles()

48: search(temp);

32: search(dir);

33: fileSearch.directorySearch(targetFile, pathToSearch);

包含有问题代码的类:

public class Driver {

    public static void main(String[] args) {

        String targetFile = "";
        String pathToSearch = "";
        int maxNumber = 0;

        Scanner input = new Scanner(System.in);


            System.out.println("max number of files to look for");


                maxNumber = input.nextInt();

                System.out.println("directory to start in");
                pathToSearch = input.next();

                System.out.println("What is the file name");
                targetFile = input.next();

                FindFile fileSearch = new FindFile(maxNumber);


                try {

                    fileSearch.directorySearch(targetFile, pathToSearch);

                } catch (IllegalArgumentException e) {
                    System.out.println("you have reach max number of files found");

                }

                int count = fileSearch.getFileResult().size();
                if (count == 0) {
                    System.out.println("no results of that file was found");
                } else {
                    System.out.println("found " + count + "of file " + targetFile);
                    for (String match : fileSearch.getFileResult()) {
                        System.out.println("location: " + match);
                    }
                }



    }
}


public class FindFile {

    private int maxFiles;
    private List<String> fileResult = new ArrayList<String>();
    private String nameOfFile;
    private int currentNumOfFiles = 0;

    /*
     * accepts the max number of files to find
     */
    public FindFile(int maxNum) {
        maxFiles = maxNum;

    }

    public FindFile() {

    }

    /*
     * @param target file name to look for and directory to start search
     */
    public void directorySearch(String target, String directory) {

        File dir = new File(directory);
        setNameOfFile(target);
        if (dir.isDirectory()) {
            search(dir);
        } else {
            System.out.println("not a directory ");
        }
    }

    public void search(File filename) throws IllegalArgumentException {
        if (filename.isDirectory()) {
            System.out.println("searching directory..." + filename.getAbsoluteFile());
            System.out.println();

            if (filename.canRead()) {
                for (File temp : filename.listFiles()) {
                    if (currentNumOfFiles == maxFiles) {
                        throw new IllegalArgumentException();
                    } else if (temp.isDirectory()) {
                        search(temp);

                    } else {

                        if (getNameOfFile().equals(temp.getName().toLowerCase())) {
                            fileResult.add(temp.getAbsolutePath().toString());
                            currentNumOfFiles = getFileResult().size();
                        }
                    }

                }
            } else {
                System.out.println("cannot read into this directory");
            }
        }

    }

    public int getCount() {
        return currentNumOfFiles;
    }

    public int getMaxFiles() {
        return maxFiles;
    }

    public void setMaxFiles(int maxFiles) {
        this.maxFiles = maxFiles;
    }

    public List<String> getFileResult() {
        return fileResult;
    }

    public String getNameOfFile() {
        return nameOfFile;
    }

    public void setNameOfFile(String nameOfFile) {
        this.nameOfFile = nameOfFile;
    }

    public int getCurrentNumOfFiles() {
        return currentNumOfFiles;
    }

    public void setCurrentNumOfFiles(int currentNumOfFiles) {
        this.currentNumOfFiles = currentNumOfFiles;
    }

}

2 个答案:

答案 0 :(得分:1)

在第

for (File temp : filename.listFiles()) {

方法filename.listFiles()有时会返回null,这会导致for循环中出现NullPointerException。

这可以是例如如果该目录不久之前存在,但在中间被删除了。如果你扫描你的C:驱动器,可能会发生这种情况,因为通常一些程序在后台运行,这可以做到这一点。

答案 1 :(得分:0)

正如@Thomas所说,listFiles()可以返回null。根据javadocs,可能会发生这种情况:

  

...如果[File]不表示目录,或者发生I / O错误。

以下是一些可能性:

  1. 存在一种竞争条件,即目录被删除,替换为文件或在迭代父目录时变为只读。

  2. 尽管canRead()返回true,但无法列出目录。有一些场景 1 ,此调用可能会返回true,但无论如何都无法读取文件或目录。

  3. IOException还有其他原因;例如网络错误或硬盘IO错误。

  4. 你不应该认为(canRead() && isDirectory()) == true意味着你不会得到null。测试null

    1 - 例如:http://bugs.java.com/view_bug.do?bug_id=6203387。我还记得看到一些相当奇怪的行为发生在SELinux阻止系统调用时强制执行&#34;模式。这可能会产生影响。