NullPointerException:尝试获取 null 数组的长度

NullPointerException: Attempt to get length of null array

提问人:Craig Archer 提问时间:10/19/2021 更新时间:10/19/2021 访问量:4664

问:

我正在开发一个 Android 应用程序。我有以下代码来编写特定文件夹中以 XLR 开头的所有文件的列表:

private List<File> getListFiles(File parentDir) {
    ArrayList<File> inFiles = new ArrayList<File>();
    File[] files = parentDir.listFiles();
    for (File file : files) {
        try {
            if ((file.exists()) && (file != null)) {
                if (file.isDirectory()) {
                    inFiles.addAll(getListFiles(file));
                } else {
                    if (file.getName().startsWith("XLR")) {
                        inFiles.add(file);
                    }
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    return inFiles;
}

在 Android 10 和 11 上,这似乎是一个问题。对于 Android 10,我启用了旧存储,而 Android 11 我可以访问所有文件。所以问题不在于文件访问。 文件夹本身可能不在我的应用文件夹中,因此需要能够列出文件

我知道 NPE 上有一个广泛的页面,我已尽力遵循那里的建议(我正在检查文件是否存在并且不是 null),但仍然无济于事。

我觉得可能有一些愚蠢的东西,一个更有经验的程序员可能会在 2 秒内挑出来......

Android ArrayList NullPointerException

评论

0赞 blackapps 10/19/2021
if (files==null) 返回 null;或者返回 inFiles;
0赞 Autocrab 10/19/2021
在第一个 IF 中切换 file.exists 和 file != null
0赞 a_local_nobody 10/19/2021
@blackapps这甚至会有所作为吗?for 循环只会遍历实际实例,这意味着它们不能为 null,对吧?还是我错了,我已经很久没有做过 Java 了
0赞 a_local_nobody 10/19/2021
@Autocrab同样的问题给你:)
0赞 Autocrab 10/19/2021
打开 listFiles 方法并读取结果数组中是否可以为 null。另外,它在哪条线上触发 NPE?

答:

1赞 Daniel Campos Olivares 10/19/2021 #1

只需阅读实际软件包的文档,即可轻松解决此问题。File

关于该方法的文档:File::listFiles

一个抽象路径名数组,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。

正如你所看到的,该方法实际上可以返回,而不仅仅是一个空数组,所以你应该在尝试遍历它之前检查该值是否为空。null

评论

0赞 Craig Archer 10/22/2021
谢谢你 - 我把前几行改成了这个:private List<File> getListFiles(File parentDir) { ArrayList<File> inFiles = new ArrayList<File>();文件[] files = parentDir.listFiles();如果(文件 != null) {