当前位置: 首页 > 面试题库 >

Java:无法在枚举内使用EnumSet:初始化错误:Tech Research人才树示例

左丘峰
2023-03-14
问题内容

错误:

...
Caused by: java.lang.ExceptionInInitializerError
...
Caused by: java.lang.ClassCastException: 
class com.evopulse.ds2150.TechTrees$BuildingTechTree
not an enum
at java.util.EnumSet.noneOf(Unknown Source)
at java.util.EnumSet.of(Unknown Source)
at com.evopulse.ds2150.TechTrees$BuildingTechTree.<clinit>(TechTrees.java:38)

这是我列举的摘录

public enum BuildingTechTree {
//Name                      SoftName                    Requirements    
NONE                        ("NULL",                    null),

->下一行是崩溃的地方

BARRACKS                    ("Barracks",                EnumSet.of(NONE),
WALLS_SANDBAGS              ("Sandbag wall",            EnumSet.of(NONE),

POWERPLANT                  ("Power plant",             EnumSet.of(BARRACKS)),
GUARDTOWER                  ("Guard Tower",             EnumSet.of(BARRACKS));

将EnumSet.of(NONE)和EnumSet.of(BARRACKS)替换为null,可以进行初始化,但是由于缺少数据结构而破坏了我的代码……显然,但是我这样做是为了测试其余的代码某种原因。

删除EnumSet.of(NONE)并仅替换为NONE,对BARRACKS相同,并更改所有相关的变量,构造函数和方法,这都不起作用…(甚至无法使用contains.all
,因为不适用于“我的更改变量” …)

我使用第二种实现扩展了此示例:https :
//gamedev.stackexchange.com/a/25652/48573

我还尝试通过逐字复制示例来跟踪步骤。添加

private static Set<BuildingTechTree> techsKnown;

techsKnown = (BuildingTechTree.BIODOME);
test = TechTrees.researchTech(techsKnown);

到另一个将用于测试初始化​​的类。不得不改变

public boolean researchTech(BuildingTechTree tech) {

静态

这导致了相同的“不是枚举”错误。我没有任何代表,要评论他的答案以指出初始化错误…

添加了两个当前答案的信息,因为这两个解决方案都会导致相同的新错误:

public class TechTrees {
private static Set<BuildingTechTree> techsKnown;

public TechTrees() {
    techsKnown = EnumSet.of(BuildingTechTree.NONE);       //Using this
    techsKnown = EnumSet.noneOf(BuildingTechTree.class);  //Or this
}

public static boolean researchTech(BuildingTechTree tech) {
    if (techsKnown.containsAll(tech.requirements)) {      //Causes null pointer
        return true;                                      //exception @ techsKnown  
    }
    return false;
}

问题答案:

您的声明结构非常聪明,这很遗憾,无法正常工作。但是EnumSet显然需要先对枚举进行完全初始化。它尝试从枚举中获取常量数组,以便除其他外,它知道其内部位集需要多少空间。

这是一种解决方法。它使用一个助手方法,该方法首先创建一个普通的set(HashSet),然后在静态初始化块中迭代枚举常量,并用EnumSets
替换所有这些set 。

public enum BuildingTechTree {
    // Named constants
    //Name                      SoftName                        Requirements
    NONE                        ("NULL",                        null),
    BARRACKS                    ("Barracks",                    setOf(NONE)),
    WALLS_SANDBAGS              ("Sandbag wall",                setOf(NONE)),
    POWERPLANT                  ("Power plant",                 setOf(BARRACKS)),
    GUARDTOWER                  ("Guard Tower",                 setOf(BARRACKS));

    private final String softName;
    private Set<BuildingTechTree> requirements;

    private BuildingTechTree(String softName, Set<BuildingTechTree> requirements) {
        this.softName = softName;
        this.requirements = requirements;
    }

    private static Set<BuildingTechTree> setOf(BuildingTechTree... values) {
        return new HashSet<>(Arrays.asList(values));
    }

    static {
        for (BuildingTechTree v : values()) {
            if (v.requirements == null) {
                v.requirements = EnumSet.noneOf(BuildingTechTree.class);
            } else {
                v.requirements = EnumSet.copyOf(v.requirements);
            }
        }
    }
}


 类似资料:
  • 我正在设计一款纯文字的电子游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似。 我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化常量。否则这场比赛就可以开始了 这是一个两难的问题: 如果我没弄错的话,枚举常量必须在枚举的第一行定义 我如何解决这个第22条军规? 以下是根据保密协议从游戏中发布的一些示例代码: 我试图用马里奥的“典型”来初始化SUPERMARIO,但我还没

  • 我用Xcode开发了一个“Hello iOS”应用程序,可以在iOS模拟器上用Appium进行测试。然而,当我试图在真正的iPhone/iPad设备上测试同一个应用程序时,我收到了以下错误消息。 这是我的环境。 我尝试了这个命令“brew安装--HEAD ideviceInster”,但得到了另一条错误消息。 有什么解决办法吗?谢谢

  • 问题内容: 当我运行项目时,会收到此错误的大量输出: 我注意到此问题的出现方式是在整个网络上被询问,但没有真正的答案。这种错误的一般原因是什么? 问题答案: NoClassDefFound错误是一个模糊的错误,通常隐藏着更严重的问题。它是不一样的ClassNotFoundException(被抛出时,该类只是普通的不存在)。 如javadocs所示,NoClassDefFound 可能指示该类不存

  • 在“初始化Java工具”期间发生内部错误。无法初始化类org.eclipse.jdt.core。JavaConventions在Eclipse中下载AspectJ开发工具后。我在用Spring靴。 我不知道是什么问题。

  • 问题内容: 如果必须在使用该对象之前对其进行初始化,那么初始化基于Java枚举的单例的正确方法是什么。 我已经开始编写代码,但是不确定是否做对了。您能帮我实现这个单例吗? 问题答案: 完全有可能为以下对象创建构造函数: 注意: 字段可以是最终的(我们喜欢) 不必是 构造函数会自动为您调用 注意最后一点。由于-singletons是在加载类时急切创建的,因此您无法将任何参数传递给构造函数。当然可以通

  • 问题内容: 我正在尝试将程序编译为一个共享库,可以在使用ctypes的Python代码中使用该共享库。 使用以下命令,库可以正常编译: 但是,当我尝试使用ctypes导入它时 我收到以下错误: 这是怎么回事? 问题答案: 非常令人沮丧的是,没有人真正显示出具体的解决方案。安装OpenCV后出现此问题。对我来说,删除此警告最简单的方法是禁用此驱动程序: