Kotlin中如何避免嵌套列表的IndexOutOfBoundsException?有无惯用写法?
Kotlin中嵌套列表访问避免数组越界的惯用写法
直接用listA[0].listB[0].listC[0].department这种链式索引访问,只要任意一个列表的索引0不存在,就会抛出IndexOutOfBoundsException。Kotlin里有几种符合风格的惯用写法来避免这个问题:
基础安全访问:
getOrNull+ 安全调用运算符
Kotlin的List自带getOrNull(index)方法,索引越界时会返回null,配合安全调用?.可以让链式调用在遇到null时直接终止,不会抛出异常。示例代码:val department = listA.getOrNull(0) ?.listB?.getOrNull(0) ?.listC?.getOrNull(0) ?.department最终
department的值要么是目标部门,要么是null,全程不会触发数组越界异常。带默认值的安全访问:配合Elvis运算符
如果不想返回null,可以用?:Elvis运算符指定默认值,当链式调用结果为null时直接返回默认值:val department = listA.getOrNull(0) ?.listB?.getOrNull(0) ?.listC?.getOrNull(0) ?.department ?: "未知部门"分步处理空情况:结合
run/let
如果需要针对每一步的空值做单独处理(比如不同层级为空时返回不同提示),可以嵌套使用run或let:val department = listA.getOrNull(0)?.run { listB.getOrNull(0)?.run { listC.getOrNull(0)?.department ?: "listC无索引0元素" } ?: "listB无索引0元素" } ?: "listA无索引0元素"
这些写法都充分利用了Kotlin的空安全特性,不需要写繁琐的if (list.size > index)判断,代码简洁且符合Kotlin的惯用风格。
内容的提问来源于stack exchange,提问作者Droidme
相关产品推荐
相关产品推荐

