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

Kotlin委托实现ConcurrentHashMap时报NoSuchElementException问题咨询

问题原因分析
  • 你误用了Kotlin的Map属性委托语法规则:当使用by 映射类实例的写法时,Kotlin会默认将该映射实例作为属性的存储容器,运行时会以属性名作为key从映射中取值返回。你的属性名为sessionMap,程序会自动调用你传入的ConcurrentHashMap的get("sessionMap")方法,该key不存在,因此直接抛出对应异常。
  • 你的写法和需求不匹配:你当前的需求是将自定义的ConcurrentHashMap实例直接赋值给sessionMap变量,不需要用到属性委托能力,直接把委托关键字by替换为赋值符号=即可解决异常。
  • 额外需要注意类型对齐问题:你当前声明的变量泛型为ConcurrentHashMap<String, Session>,但匿名类继承的父类泛型为ConcurrentHashMap<String, WebSocketSession>,如果Session不是WebSocketSession的父类,后续还会触发类型不兼容错误,需要根据实际业务对齐泛型类型。
正确示例代码
val sessionMap: ConcurrentHashMap<String, Session> = object : ConcurrentHashMap<String, Session>() {
    override fun put(key: String, value: Session): Session? {
        // 你的自定义逻辑
        return super.put(key, value)
    }
}

如果确实需要使用属性委托实现特殊逻辑,需要实现Kotlin标准库的委托接口,而不是直接传入Map实例:

import kotlin.reflect.KProperty
import kotlin.properties.ReadOnlyProperty

class SessionMapDelegate : ReadOnlyProperty<Any?, ConcurrentHashMap<String, Session>> {
    private val map = object : ConcurrentHashMap<String, Session>() {
        override fun put(key: String, value: Session): Session? {
            // 自定义逻辑
            return super.put(key, value)
        }
    }
    override fun getValue(thisRef: Any?, property: KProperty<*>): ConcurrentHashMap<String, Session> {
        return map
    }
}

// 调用时使用by
val sessionMap: ConcurrentHashMap<String, Session> by SessionMapDelegate()

内容的提问来源于stack exchange,提问作者user16799920

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:18:03