Kotlin中let函数未拦截空对象引发NullPointerException问题
问题分析与解决
你的item.material?.let确实生效了——当material为null时,let块内的代码不会执行。但问题出在map操作的结果上:当material为null时,对应位置的map返回值是null,最终clothes列表中会混入null元素。后续你处理这个列表时,若直接对这些null对象调用getStatus(),就会触发NullPointerException。
解决方案
1. 过滤null元素(推荐)
使用mapNotNull替代map,自动过滤掉所有null结果,确保clothes列表中全是非空对象:
val clothes = items.mapNotNull { item -> item.material?.let { material -> Mapper.fromRetrofitResponseToObjectEntity(material, item) } }
2. 为null场景设置默认值
如果业务需要保留所有元素(即使material为null也要对应一个实体),可以用?:运算符提供默认实体:
val clothes = items.map { item -> item.material?.let { material -> Mapper.fromRetrofitResponseToObjectEntity(material, item) } ?: ClothEntity(status = Status.UNKNOWN) // 替换为你的默认实体构造逻辑 }
3. 检查Mapper方法的返回值
确认Mapper.fromRetrofitResponseToObjectEntity方法是否可能在material非null时返回null。如果存在这种情况,需要在方法内部处理null返回的问题,或者在let块后追加判空逻辑。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

