首页 > 解决方案 > 从 Android 外部存储读取文件时出现 NullPointerException

问题描述

尝试从 Android 外部 SD 卡读取 zip 文件时遇到了一些麻烦。

这是我的代码:

File[] fileArr = mVersionUpgradeViewModel.getZipFileFromSDCard();
for(int i = 0; i < fileArr.length; i++){
    System.out.println(fileArr[i]);
}

public File[] getZipFileFromSDCard() {
    File[] matchingFiles = new File[0];
    File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    if(f.exists()) {
        matchingFiles = f.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.endsWith("zip");
            }
        });
    }
    return matchingFiles;
}

我的模拟器文件夹结构:

在此处输入图像描述

zip文件夹在那里。但是使用上面的代码,我收到如下错误消息:

Caused by: java.lang.NullPointerException: Attempt to get length of null array
    at com.mainapp.asynctask.VersionUpgradeTask.doInBackground(VersionUpgradeTask.java:86)
    at com.mainapp.asynctask.VersionUpgradeTask.doInBackground(VersionUpgradeTask.java:15)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)

错误指向第一个 for 循环。上次还在工作。但是在我尝试了较新版本的安装代码后,上面的方法就失效了。有任何想法吗?

谢谢!

标签: javaandroidstorageandroid-sdcard

解决方案


matchingFiles您使用 0 个元素的数组进行初始化:

File[] matchingFiles = new File[0];

然后检查是否Environment.DIRECTORY_DOWNLOADS存在,如果存在,则重新创建matchingFiles为其中以 zip 结尾的文件数组。

堆栈跟踪清楚地表明该方法没有抛出错误,但可以安全地假设该方法的结果有问题。

现在,稍后matchingFiles是一个null数组,因此 Environment.DIRECTORY_DOWNLOADS 确实存在,因此您要么没有文件夹的读取权限,要么Environment.DIRECTORY_DOWNLOADS未设置为所示结构中的下载文件夹,或者您正在检查的 zip 文件受到限制运行应用程序的用户。

您可能想检查是否matchingFilesnull,如果是,请将其设置new File[0]在方法的末尾以改进您的代码,但解决方案显然是检查您对文件夹和文件的权限。


推荐阅读