按指定顺序排序自定义组件时非列表项触发空指针异常如何解决
问题根源
空指针异常由代码中的!!强制解包操作触发:当scheduleCommandList里的组件名称不在requiredList的key中时,requiredList[o1.name]会返回null,强制解包直接抛出NPE。
解决方案
给未出现在预定义列表里的科目统一设置一个比所有预定义权重都大的兜底值,避免空值出现,同时满足非预定义科目排在最后的需求。
修改后的排序逻辑代码如下:
private fun sortCommandList(scheduleCommandList: ArrayList<BaseComponent>): ArrayList<BaseComponent> { // 兜底权重天然取列表长度即可,永远比所有已定义的权重(从0开始计数)大1 val defaultWeight = requiredList.size val comparator = Comparator { o1: BaseComponent, o2: BaseComponent -> val weight1 = requiredList.getOrDefault(o1.name, defaultWeight) val weight2 = requiredList.getOrDefault(o2.name, defaultWeight) val weightDiff = weight1 - weight2 // 可选:权重相同(均为非预定义科目)时按名称排序,保证排序结果稳定,不需要可直接返回weightDiff return@Comparator if (weightDiff == 0) { o1.name.compareTo(o2.name) } else { weightDiff } } val copy = arrayListOf<BaseComponent>().apply { addAll(scheduleCommandList) } copy.sortWith(comparator) return copy }
逻辑说明
- 用
getOrDefault替代直接取值+强制解包,从根源上避免空指针 - 兜底权重取
requiredList.size,无需手动维护,后续新增预定义科目时自动适配 - 可选的同权重排序逻辑,解决非预定义科目排序结果随机的问题,可根据业务需要选择是否保留
内容的提问来源于stack exchange,提问作者SRam
相关产品推荐
相关产品推荐

