You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:45:55