【问题标题】:NullPointerException when using java.io.File使用 java.io.File 时出现 NullPointerException
【发布时间】:2012-07-23 11:42:44
【问题描述】:

我正在尝试使用这个程序来计算 D:\ 驱动器中的所有文件,但是当我运行它时它会抛出异常。

package lmh;

import java.io.File;

public class FileList {

    static int fileNum = 0;
    static int directoryNum = 0;
    static int cannotRead = 0;

    public static void main(String[] args) {
        File f = new File("e:/");
        printFileStructure(f);
        System.out.println("result:");
        System.out.println("file number:" + fileNum);
        System.out.println("directory number:" + directoryNum);
        System.out.println("cannot rend:" + cannotRead);
    }

    public static void printFileStructure(File f) {
        File[] files = f.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
                if (files[i].canRead()) {
                    fileNum++;
                    System.out.println(files[i].getName());
                } else {
                    cannotRead ++;
                } 
            }
            else if (files[i].isDirectory()) {
                if (files[i].canRead()) {
                    directoryNum++;
                    printFileStructure(files[i]);
                } else {
                    cannotRead ++;
                }
            }
        }
    }
}

【问题讨论】:

  • 例外情况是???
  • java.lang.NullPointerException
  • 如果它与我的测试类似,它将在f.listFiles()附近
  • 堆栈跟踪应该告诉您引发异常的确切行。

标签: java java-io


【解决方案1】:

File.listFiles() 不保证返回非空值。这往往会发生(根据我的经验),因为 Java 可以看到看起来像目录的内容,但无法列出它(想到联结)

【讨论】:

    【解决方案2】:

    甚至是javadoc

    f.listFiles()
    

    说... 如果此抽象路径名不表示目录,则此方法返回 null。否则返回一个 File 对象数组,一个对应于目录中的每个文件或目录。结果中不包括表示目录本身和目录父目录的路径名。每个生成的抽象路径名都是使用 File(File, String) 构造函数从这个抽象路径名构造的。因此,如果这个路径名是绝对的,那么每个生成的路径名都是绝对的;如果此路径名是相对的,则每个生成的路径名都将相对于同一目录。

    所以我相信这是罪魁祸首。

    【讨论】:

    • 你还想要 D: 还是 E: ?
    • @LMH 请接受其中一个答案,以便其他人也可以找到解决方案。
    【解决方案3】:

    由于 MadProgrammer 指出的原因,添加一个空检查。

    替换:

    for (int i = 0; i < files.length; i++) {
    

    if(files != null)
        for (int i = 0; i < files.length; i++) {
    

    我将驱动器更改为 D(因为我没有 E 驱动器)并且程序在我的机器上通过此修复成功完成。

    【讨论】:

      【解决方案4】:

      尝试 "E:\\" 进入目录。我认为它应该有效。

      【讨论】:

      • 任何一种方式都应该有效。当涉及到斜杠和愚蠢的反斜杠时,文件 API 非常灵活。 NullPointerException 必须由在非目录上调用 f.listFiles() 引起。
      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 2013-12-19
      • 2022-01-19
      • 2013-04-13
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多