从Android外部存储读取文件时出现NullPointerException

时间:2018-06-11 07:26:16

标签: java android storage android-sdcard

尝试从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;
}

我的模拟器文件夹结构:

enter image description here

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循环。它上次工作了。但在我尝试了较新的版本安装代码后,上面的方法就会中断。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您确定已获得读取外部存储空间的许可

List<File> fileArr = getZipFileFromSDCard();
    for (int i = 0; i < fileArr.size(); i++) {
        System.out.println(fileArr.get(i));
    }

 public List<File> getZipFileFromSDCard() {
    List<File> matchingFiles = new ArrayList<>();
    File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString());
    File[] files = wallpaperDirectory.listFiles();
    for (File file : files) {
        if (file.getName().endsWith("pdf")) {
            matchingFiles.add(file);
        }
    }

    return matchingFiles;
}

答案 1 :(得分:0)

使用0个元素的数组初始化matchingFiles

File[] matchingFiles = new File[0];

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

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

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

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