首页 > 解决方案 > 无法在被映射的枚举的初始化程序中构造 EnumMap

问题描述

在我的代码中,我有一个枚举,其中每个值都存储一个单独的 EnumMap。但是,当我尝试在构造函数或初始化程序中初始化 EnumMap 时,使用以下代码:

public static void main(String[] args) {
   RPS.values(); // forces initialization of enum values
}

enum RPS {
   ROCK,
   PAPER,
   SCISSORS;
   EnumMap<RPS,Boolean> matchups;
   {
      matchups = new EnumMap<>(RPS.class);
   }
}

它抛出由 NullPointerException 引起的 ExceptionInInitializerError。但是,当我在构造函数之外对其进行初始化时,不会引发错误,如下面的代码所示:

public static void main(String[] args) {
   for (RPS val:RPS.values())
      val.matchups = new EnumMap<>(RPS.class);
}

enum RPS {
   ROCK,
   PAPER,
   SCISSORS;
   EnumMap<RPS,Boolean> matchups;
}

为什么会发生此错误,我该如何解决?

标签: javaenumsenum-map

解决方案


只需将您的初始化移动到静态块,因为 RPS 枚举值由那时确定:

enum RPS {
   ROCK,
   PAPER,
   SCISSORS;

   EnumMap<RPS,Boolean> matchups;
   static
   {
        for (RPS val:RPS.values())
            val.matchups = new EnumMap<>(RPS.class);
   }
}

推荐阅读