java - 从 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 循环。上次还在工作。但是在我尝试了较新版本的安装代码后,上面的方法就失效了。有任何想法吗?
谢谢!
解决方案
matchingFiles
您使用 0 个元素的数组进行初始化:
File[] matchingFiles = new File[0];
然后检查是否Environment.DIRECTORY_DOWNLOADS
存在,如果存在,则重新创建matchingFiles
为其中以 zip 结尾的文件数组。
堆栈跟踪清楚地表明该方法没有抛出错误,但可以安全地假设该方法的结果有问题。
现在,稍后matchingFiles
是一个null
数组,因此 Environment.DIRECTORY_DOWNLOADS 确实存在,因此您要么没有文件夹的读取权限,要么Environment.DIRECTORY_DOWNLOADS
未设置为所示结构中的下载文件夹,或者您正在检查的 zip 文件受到限制运行应用程序的用户。
您可能想检查是否matchingFiles
是null
,如果是,请将其设置new File[0]
在方法的末尾以改进您的代码,但解决方案显然是检查您对文件夹和文件的权限。
推荐阅读
- design-patterns - 哪种类型的实现会更适合服务层?
- azure - Azure WebRole 粘性负载平衡
- kubernetes - istio-proxy 访问日志是什么意思?
- vb.net - 检查数组中每个文本框的标签
- android - Android:“发送到 SYSTEM 的 Binders 太多”是什么意思?
- python - (Python)如何在“实时”中将变量从 file1.py 传递到 file2.py?
- java - 通过在 java 中定期进行 Web 服务调用来更新 sqlite 数据库
- javascript - 为什么使用 jquery.find(":input") 添加动态输入时无法获取输入元素?
- git - 执行请求的更改而不是拉取请求的所有者
- git - git - 将分阶段的更改提交到另一个分支并合并