Skip to content

[1.12.2] DyeColor 静态初始化失败,GRAY 颜色键重复 #929

Description

@handy-git

问题描述

在 CatServer 1.12.2 环境中,插件启用时只要触发 org.bukkit.DyeColor 的类初始化,就会导致服务端抛出 ExceptionInInitializerError

异常根因来自 DyeColor.<clinit> 中构建 ImmutableMap<Color, DyeColor> 时出现重复 key:

java.lang.IllegalArgumentException: Multiple entries with same key: Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY

异常堆栈关键部分

Caused by: java.lang.IllegalArgumentException: Multiple entries with same key: Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY
    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:186)
    at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:102)
    at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:88)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:359)
    at org.bukkit.DyeColor.<clinit>(DyeColor.java:206)

触发方式

任意调用会触发 DyeColor 静态初始化的方法都可能复现,例如:

DyeColor.values();

或间接调用羊实体颜色相关方法:

sheep.getColor();

预期行为

DyeColor 应该可以正常完成静态初始化,DyeColor.values() 不应抛出异常。

实际行为

DyeColor 在静态初始化 BY_COLOR / BY_FIREWORK 映射时失败,导致依赖 DyeColor 的插件无法启用或相关功能运行时报错。

初步分析

从 Bukkit 1.12.2 的 DyeColor 源码看,16 个枚举项的 Color.fromRGB(...) 值并不存在重复,0x474F52 只对应 GRAY

但运行时报错显示:

Color:[rgb0x474F52]=GRAY and Color:[rgb0x474F52]=GRAY

两个冲突 value 都是 GRAY,这不像是正常枚举颜色重复,更像是 CatServer 运行时的 DyeColor / Color 实现、字节码打包或类加载存在异常。

影响

依赖 Bukkit DyeColor 的插件可能无法启动,或在相关功能运行时报错,例如:

DyeColor.values();
Sheep#getColor();
DyeColor#getByColor(...);

在本次问题中,插件注册命令补全时调用了 DyeColor.values(),因此在插件启用阶段直接失败。

环境

  • 服务端核心: CatServer 1.12.2
  • Java 版本: 1.8.0_481
  • Guava: 21.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions