为可变Map正确应用Kotlin作用域函数以避免空指针异常
问题分析与解决
你的apply作用域函数语法本身没问题,空指针异常的核心原因是:你定义的MutableMap<String, String>要求值必须是非空的String,但deck.getString()或mOptions.getString()可能返回null,存入Map时触发空指针。
以下是两种正确的处理方案:
方案1:兜底处理null值(推荐)
给所有可能返回null的调用添加默认值,确保存入Map的都是非空字符串:
mValues.apply { this["name"] = deck.getString("name") ?: "" this["desc"] = deck.getString("desc") ?: "" this["deckConf"] = deck.getString("conf") ?: "" // general this["maxAnswerTime"] = mOptions.getString("maxTaken") ?: "" this["showAnswerTimer"] = parseTimerValue(mOptions).toString() this["autoPlayAudio"] = mOptions.getBoolean("autoplay").toString() this["replayQuestion"] = mOptions.optBoolean("replayq", true).toString() }
?: ""表示如果左边的值是null,就用空字符串兜底,避免违反Map的非空值约束。另外,Kotlin中更推荐用this[key] = value的写法替代set(key, value),风格更统一。
方案2:允许Map存储null值
如果业务逻辑允许Map中存在null值,修改Map的泛型类型为String?(可空字符串):
val mValues: MutableMap<String, String?> = HashUtil.HashMapInit(30) mValues.apply { set("name", deck.getString("name")) set("desc", deck.getString("desc")) set("deckConf", deck.getString("conf")) // general set("maxAnswerTime", mOptions.getString("maxTaken")) set("showAnswerTimer", parseTimerValue(mOptions).toString()) set("autoPlayAudio", mOptions.getBoolean("autoplay").toString()) set("replayQuestion", mOptions.optBoolean("replayq", true).toString()) }
这样存入null就不会触发空指针异常了。
另外额外检查:确认HashUtil.HashMapInit(30)是否返回了有效的非空Map实例,如果这个工具方法存在返回null的可能,那调用apply时会直接触发空指针,需要修复工具方法确保返回非空Map。
内容的提问来源于stack exchange,提问作者Critical AY
相关产品推荐
相关产品推荐

