Java NullPointer在目录上调用listFiles()时的异常

2022-09-03 00:14:27

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


答案 1

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

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

顺便说一句,API是一个很好的例子,说明生活无一例外地有多糟糕。File


答案 2

对于已经包含以下解决方案的开发人员:

  1. 已添加存储权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2.您要列出文件的目录中存在。

  1. 在应用权限设置中启用了您正在测试的设备中的权限

如果您的设备SDK大于或等于ANDROID 10(Q),下面的代码将解决您的问题

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

<application android:requestLegacyExternalStorage="true"...</application>

如果您的问题已解决,请告诉我!


推荐