android NullPointerException externalCacheDir

先看代码:

fun Context.getMyCacheDir(): String {
    return externalCacheDir!!.absolutePath + "/my_cache"
}

如上代码,在某些手机可能会出现crash。
原因详细阅读api,注意他有一个大大的注解Nullable:

    @Nullable
    public abstract File getExternalCacheDir();

api的内容描述最后一句为:
May return null if shared storage is not currently available.
如果共享存储不可用就是null。
Shared storage may not always be available, since removable media can be ejected by the user.
有些手机可能是可插拔的sdcard。
可以使用Environment.isExternalStorageEmulated()来检查。

那么, 简单来看,
getExternalCacheDir:
/storage/sdcard/Android/data/<应用包名>/cache
getCacheDir:
/data/data/<应用包名>/cache

同理:getExternalFilesDir与getFilesDir。

我们解决办法也轻轻松,因为cacheDir不可能不存在:

fun Context.getMyCacheDir(): String {
    return (externalCacheDir ?: cacheDir).absolutePath + "/my_cache"
}

题外话:
看android api,java代码需要注意注解Nullable, NotNull等。kotlin则语言级别自带。通过返回值或者参数的注解要求来处理自己的值。

你可能感兴趣的:(android)