在目录上调用listFiles()时发生Java NullPointerException

在目录上调用listFiles()时发生Java NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我在服务器上有一系列包含书籍的文件夹,我正在使用这段代码访问这些文件夹。我想让这些文件夹中的每一个都成为一个对象,这样我以后就可以处理其中的文件了。我正在尝试使用此方法将文件夹列表作为图书对象返回 public List<Book> getBooks(File folder){ List<Book> books = new ArrayList<Book>(); for (File f : folder.listFiles()){

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

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语句打印出文件夹的完全相同路径,然后打印出不同的内存地址,这也是预期的。当它点击“空”文件夹时,它会再次为内存地址打印null

现在,对于真正的问题,带有for循环的行是程序崩溃并抛出一个NullPointerException的地方,而listFiles方法的文档中甚至没有描述这个问题

为什么会发生这种情况?另外,为什么我的非空文件夹返回null?

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

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


顺便说一句,
文件
API是一个很好的例子,说明生活是多么糟糕,没有例外。

我对dir.listfiles()也有类似的问题;为用户文件夹\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5返回null\

默认情况下,文件夹的权限设置为“everyone”Deny all

我想,让我心烦的是,我从来没想过会有人拒绝允许我在那里生存

也适用于任何一个不清楚我所说的拒绝许可是什么意思的人


当您为用户权限设置“拒绝”时,它会覆盖“允许用户权限”,除非您将其删除,并且它是在windows 10 home的默认安装中进行的。

对我来说,这是由尾随空格引起的。对于已经包含以下解决方案的开发人员,请使用variable.trim()

  • 添加了存储权限
  • 
    
    2.要列出文件的目录已存在

  • 已在应用程序权限设置中启用您正在测试的设备中的权限
  • 如果您的设备SDK大于或等于ANDROID 10(Q),下面的代码将解决您的问题。

    在清单文件中,在标记中包含此代码


    堆栈跟踪的存在是有原因的。阅读它,理解它。@Mat-如果要迭代的对象为空,“foreach”操作符(
    )抛出NPE(在您的情况下,
    bookFolder.listFiles()
    )@skaffman-stacktrace只告诉您NPE发生的位置,而不是原因。有时是明显的,有时不是,这取决于这条线的进展情况。@Kevin K-谢谢,这就是我一直在寻找的答案。现在我必须首先弄清楚为什么它们是空的。顺便说一句,你的变量名令人困惑。
    书籍
    是一个
    文件
    ,要将其添加到
    书籍
    列表中,必须从
    书籍
    创建一本
    书籍
    。我建议不要把书和文件混为一谈。另一个原因可能是文件不是目录。嗯,一般来说确实如此!但是,在这种情况下,似乎已经进行了适当的测试来排除这种情况。@erickson我想知道,当我确定它们包含其他文件时,它们为什么返回null。该路径肯定是一个目录,因为我检查以确保它是一个目录,并且同一服务器上的其他文件夹可以使用此代码正常工作,因此我认为这不是权限问题。此代码使用的服务以管理员用户身份运行,这使我更加确定它不是权限问题。@erickson-非常感谢您的帮助你的帮助。事实证明,由于打开了太多文件,我的空间似乎用完了,这似乎就是listFiles()开始返回null而不是内存地址的原因。
    public Book(File bookFolder) {
        this.bookFolder = bookFolder;
        this.bookPath = bookFolder.getAbsolutePath();
    
        System.out.println(bookFolder + " " + bookFolder.listFiles());
    
        for (File f : bookFolder.listFiles()) {
            ...
        }
    }
    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    <application android:requestLegacyExternalStorage="true"...</application>