Android Kotlin 中通过Enum值映射获取Enum类型报空问题如何解决
问题原因
Kotlin 中 Map 的 get 方法默认返回可空类型,你定义的 fromType 方法声明返回非空的 ConversationStatus 类型,当传入的 status 不在枚举预设的映射范围内时,mapByStatus[status] 会返回 null,和非空返回值的声明冲突,就会触发空类型报错。
修复方案
可以根据你的业务场景选择以下任意一种方案:
- 方案1:强制定非空(仅适合入参完全可控的场景)
直接在取值后加非空断言,确认入参一定是合法值时使用,遇到非法值会直接抛出空指针。fun fromType(status: String): ConversationStatus { return mapByStatus[status]!! } - 方案2:返回可空类型,交由调用方处理空情况
修改方法签名返回可空类型,调用方可以通过空安全运算符自行处理空场景。fun fromType(status: String): ConversationStatus? { return mapByStatus[status] } - 方案3:设置默认 fallback 枚举(推荐外部入参场景使用)
可以新增一个UNKNOWN未知状态作为兜底,遇到非法值时默认返回该状态,避免崩溃。
不需要新增枚举的话也可以指定现有枚举作为默认值,比如enum class ConversationStatus(val status: String) { OPEN("open"), CLOSED("closed"), UNKNOWN("unknown"); // 新增未知状态兜底 companion object { private val mapByStatus = values().associateBy(ConversationStatus::status) fun fromType(status: String): ConversationStatus { return mapByStatus[status] ?: UNKNOWN } } }return mapByStatus[status] ?: CLOSED。 - 方案4:非法值抛出明确异常
遇到非法入参时抛出业务异常,比非空断言的空指针更易排查问题。fun fromType(status: String): ConversationStatus { return mapByStatus[status] ?: throw IllegalArgumentException("非法的会话状态参数:$status") }
选型建议
如果status参数是后端返回、用户输入等不可控的外部入参,优先选方案3加兜底状态,或者方案4抛出明确异常;如果是内部逻辑流转的可控入参,可以按需选择方案1或方案2。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

