我在用这段代码访问的服务器上有一系列包含书籍的文件夹。我想使每个文件夹成为一个对象,以便以后可以对其中的文件进行一些处理。我正在尝试使用此方法将文件夹列表作为Book对象返回。

public List<Book> getBooks(File folder){
    List<Book> books = new ArrayList<Book>();
    for (File f : folder.listFiles()){
        if (f.isDirectory()){
            System.out.println(f.getAbsolutePath() + "" + f.listFiles());
            books.add(new Book(f));
        }
    }
    return books;
}

此块中的println语句按应有的方式打印文件夹的直接路径,然后打印内存地址以及其他一些信息。但是,在文件夹中的某个位置,当调用listFiles()时,它的输出为null。执行此操作的文件夹不为空。然后,这个空文件夹被传递给我的类init方法。
public Book(File bookFolder) {
    this.bookFolder = bookFolder;
    this.bookPath = bookFolder.getAbsolutePath();

    System.out.println(bookFolder + " " + bookFolder.listFiles());

    for (File f : bookFolder.listFiles()) {
        ...
    }
}

此块中的println语句打印出与文件夹完全相同的路径,然后打印出不同的内存地址,这也是预期的。当它打到“空”文件夹时,它将再次为内存地址输出null。

现在,对于真正的问题,带有for循环的行是程序崩溃并引发NullPointerException的地方,在listFiles方法的文档中甚至没有描述。

为什么会这样呢?另外,为什么我的非空文件夹返回null?

最佳答案

listFiles() 方法的文档明确指出:“如果此抽象路径名不表示目录,或者发生I/O错误,则返回null。”

无法列出目录的最常见原因之一是该进程缺少正确的权限。您是自己运行还是在以其他用户身份运行的某种服务中运行它?

顺便说一句,File API是一个很好的例子,说明无异常(exception)的生活会多么糟糕。

关于java - 在目录上调用listFiles()时出现Java NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6117191/

10-09 12:49