【问题标题】:java.lang.NullPointerException when trying to read files尝试读取文件时出现 java.lang.NullPointerException
【发布时间】:2011-03-14 21:24:37
【问题描述】:

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

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.我标记了行号!

【问题讨论】:

    标签: java file stream


    【解决方案1】:

    看起来 dir.listFiles 返回了 null。

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

    【讨论】:

      【解决方案2】:

      第 28 行中的 dir 变量可能为空。在调用readAllFiles 之前,您可能需要检查dir.listFiles() 的结果。

      【讨论】:

        【解决方案3】:

        代替

        if (!itr.isFile()) {
        

        使用

        if (itr.isDirectory()) {
        

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

        【讨论】:

        • 很高兴知道/还能是什么?
        • @yotamoo 设备驱动程序、命名管道等 - 但即使这不是真的,当你想测试某个东西是否是一个目录时,为什么不直接使用isDirectory()
        【解决方案4】:

        我会这样写。当我测试它时工作正常:

        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;
        }
        

        【讨论】:

        • 你好,list 相比 ArrayList 有什么优势?
        • 界面设计 - 没听说过这个想法?您不宣传该类的具体类型,因此如果您更改它,客户端不会受到影响。查看 java.sql 包——所有重要的类都是接口。有没有想过为什么?
        【解决方案5】:

        您应该执行if (itr.isDirectory()) 并检查if (tmp != null) 是否为空。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-08
            • 1970-01-01
            • 1970-01-01
            • 2012-10-30
            • 2018-02-03
            • 1970-01-01
            相关资源
            最近更新 更多