Android中getLocales().get(0)是否为空?try-catch是否必要?
作为Android开发者,我来拆解你提出的几个问题:
一、这个try-catch块是否真的有必要?
结论是:标准Android系统环境下几乎不需要,但如果要兼容各种定制ROM,保留它也算是一种稳妥的防御性编程。
从官方API设计来看,Resources.getSystem()、getConfiguration()这些方法在正常系统状态下都不会返回null,getLocales()返回的LocaleList也必然包含至少一个Locale,所以get(0)不会抛出越界异常。但问题在于,市面上存在大量定制化的Android ROM,有些厂商可能对系统资源模块做了非标准修改,极端情况下可能触发意想不到的异常——比如某些ROM中系统资源的Configuration对象出现异常,导致getLocales()调用失败。如果你的应用需要覆盖尽可能多的设备,保留这个try-catch可以避免因这类小众问题崩溃;如果只针对原生Android或规范的大厂ROM,去掉它也完全没问题。
二、getLocales()是否可能返回null或空数组?
绝对不会。根据Android官方文档,API 24(N)及以上的getLocales()方法返回的是LocaleList对象,这个类的设计保证了永远不会为null,且至少包含一个有效的Locale。系统启动时一定会初始化默认的区域设置,哪怕是最基础的 fallback Locale(比如en-US),所以不存在空数组的情况。
三、Resources.getSystem().getConfiguration().getLocales().get(0)是否可能为空?
同样不可能。因为LocaleList不能为空,get(0)获取的是列表中的首选Locale,而每个Locale对象本身都是有效的、非null的——系统不会允许空的区域设置存在。所以这条调用链在正常情况下必然返回一个合法的Locale实例。
总结一下:如果追求代码简洁,且应用运行环境可控,你可以去掉这个try-catch;如果要最大化兼容性,保留它也没什么成本,毕竟异常处理的逻辑很简单。
内容的提问来源于stack exchange,提问作者jonnyB_5531

