使用DiskLruCache时触发NullPointerException问题求助
嘿,我来帮你搞定这个DiskLruCache里的NullPointerException问题!
问题根源分析
你的代码核心隐患是没对context.getExternalCacheDir()的返回值做空判断——当外部存储状态显示挂载,但实际因为权限缺失(比如Android 6.0+未申请动态存储权限)、存储设备异常等情况导致无法访问时,getExternalCacheDir()会返回null,这时候调用.getPath()就直接触发空指针异常了。
修复后的完整代码
private static File getDiskCacheDir(Context context, String uniqueName) { String cachePath; // 先判断外部存储是否可用且非移除状态 boolean isExternalAvailable = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); boolean isExternalNotRemovable = !Environment.isExternalStorageRemovable(); if (isExternalAvailable && isExternalNotRemovable) { File externalCacheDir = context.getExternalCacheDir(); // 关键:增加空判断,避免NPE if (externalCacheDir != null) { cachePath = externalCacheDir.getPath(); } else { // 外部缓存目录获取失败,降级到内部存储 cachePath = context.getCacheDir().getPath(); } } else { // 外部存储不可用,直接使用内部存储 cachePath = context.getCacheDir().getPath(); } // 拼接专属缓存目录并返回 return new File(cachePath + File.separator + uniqueName); }
额外避坑提示
- 动态权限适配:如果应用目标SDK≥23,别忘了在运行时申请
WRITE_EXTERNAL_STORAGE权限(Android 10+访问应用专属外部缓存目录无需此权限,但低版本设备仍需适配)。 - 初始化前的目录校验:创建DiskLruCache实例前,最好先确保缓存目录存在,不存在则主动创建:
File cacheDir = getDiskCacheDir(context, "your_unique_cache_name"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } // 再初始化DiskLruCache DiskLruCache cache = DiskLruCache.open(cacheDir, appVersion, valueCount, maxCacheSize);
这样就能彻底避免因缓存目录获取失败导致的空指针问题啦~
内容的提问来源于stack exchange,提问作者zeqi liu
相关产品推荐
相关产品推荐

