尝试读取文件时出现java.lang.NullPointerException

时间:2011-03-14 21:24:37

标签: java file stream

喜 我有一个小程序,从命令行获取一个目录,并添加此目录及其子文件夹中的所有文件..所以这里是代码:

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)

关于它为什么会发生的任何想法?谢谢! 附:我标记了行号!

6 个答案:

答案 0 :(得分:3)

看起来dir.listFiles返回null。

引用doc,“如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。”。

答案 1 :(得分:2)

第28行中的dir变量可能为null。您可能希望在调用dir.listFiles()之前检查readAllFiles的结果。

答案 2 :(得分:1)

而不是

if (!itr.isFile()) {

使用

if (itr.isDirectory()) {

如果它不是文件,则不一定是目录。

答案 3 :(得分:0)

您应该if (itr.isDirectory())并检查空if (tmp != null)

答案 4 :(得分:0)

我会使用listFile(FileFilter)并让FileFilter返回File.canRead()。看看你是否得到了所有预期的文件,如果没有弄清楚为什么它们不可读。

答案 5 :(得分: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;
}