Android 10/11环境下获取XLR前缀文件列表时出现NullPointerException问题求助
问题分析与解决方案
核心问题定位
你遇到的NullPointerException根源在于**parentDir.listFiles()可能返回null**,而你的代码直接对这个返回值进行了增强for循环遍历,当返回null时就会触发"Attempt to get length of null array"异常。
你虽然在循环内部检查了file.exists()和file != null,但完全漏掉了对listFiles()返回值的空判断——哪怕parentDir是存在且非空的,在Android 10+/11的某些场景下(比如目录是特殊系统目录、存在访问限制的共享目录,或者系统存储框架的特殊处理),listFiles()依然可能返回null。
修复后的代码
我们只需要在遍历前先判断files数组是否为null,同时优化逻辑提前过滤无效目录:
private List<File> getListFiles(File parentDir) { ArrayList<File> inFiles = new ArrayList<File>(); // 先校验父目录的有效性,避免无效目录引发后续问题 if (parentDir == null || !parentDir.exists() || !parentDir.isDirectory()) { return inFiles; } File[] files = parentDir.listFiles(); // 关键判断:避免对null数组进行遍历 if (files == null) { return inFiles; } for (File file : files) { try { if (file == null || !file.exists()) { continue; // 跳过无效的文件/目录 } 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的分区存储(即使开启传统存储兼容)对部分公共目录的子目录仍有访问限制,比如其他应用在
Download目录下的私有子目录,listFiles()可能返回null - Android 11的
MANAGE_EXTERNAL_STORAGE权限虽能访问大部分文件,但系统核心目录(如/system)仍无法访问,此时listFiles()也会返回null - 建议调用该方法前打印
parentDir.getAbsolutePath(),确认目标目录路径是否正确,避免因传入错误路径引发问题
内容的提问来源于stack exchange,提问作者Craig Archer
相关产品推荐
相关产品推荐

