Groovy枚举键Map的get操作返回null问题排查(附代码示例)
Groovy枚举作为Map键get返回null引发NPE的原因及解决办法
问题原因
你初始化Map时踩了Groovy语法的常见坑:Map字面量里的VIDEO_GENERATION被默认解析成字符串字面量,而非CHANA_OPERATION枚举的实例。这导致checkers Map实际存储的键类型是String,和你声明的Map<CHANA_OPERATION, Closure>类型不匹配。当你用CHANA_OPERATION.VIDEO_GENERATION枚举实例调用get()方法时,找不到对应字符串键的条目,自然返回null,最终触发NullPointerException。
解决方案
修改Map初始化代码,用括号包裹枚举实例,明确告诉Groovy这是Map的键(而非字符串):
class Test { static void main(String[] args){ Map<CHANA_OPERATION, Closure> checkers = [ (CHANA_OPERATION.VIDEO_GENERATION): (userId) -> { System.out.println("..............") }, (CHANA_OPERATION.TEXT_API_CALL): (userId)->{ return false } ] checkers.get(CHANA_OPERATION.VIDEO_GENERATION).call(1) } enum CHANA_OPERATION{ VIDEO_GENERATION(0), TEXT_API_CALL(1), TEXT_VIDEO_API_CALL(2) int code CHANA_OPERATION(int code){ this.code = code } } }
补充说明
Groovy的Map字面量语法规则:如果键是不带引号的标识符,默认会被处理为字符串;只有当键被括号()包裹时,才会被解析为表达式(比如变量、枚举实例、方法调用等)。必须用括号把枚举实例包起来,才能让Map的键类型和声明一致。
内容的提问来源于stack exchange,提问作者shijie xu
相关产品推荐
相关产品推荐

