You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为可变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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:10:26