- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
错误:
...
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) {
静态
这导致了同样的“in not an enum”错误。我没有任何代表评论他的回答以指出初始化错误...
为两个当前答案添加了信息,因为两个解决方案都会导致相同的新错误:
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
显然需要先完全初始化枚举。它尝试从枚举中获取常量数组,以便除其他事项外,它知道其内部位集需要多少空间。
这是一种解决方法。它使用辅助方法首先创建一个普通集合 (HashSet
),然后在静态初始化 block 中迭代枚举常量并将所有集合替换为 EnumSet
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);
}
}
}
}
关于Java:无法在枚举中使用 EnumSet:初始化错误:Tech Research Talent Tree 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777646/
我正在尝试解决人才伙伴的这个问题。 http://www.talentbuddy.co/challenge/52a9121cc8a6c2dc91481f8d5233cc274af0110af382f4
我希望这篇文章能够发展成为一份关于签约升级重要电子商务网站的一般利弊列表。 (比方说,400-1200 小时的工作取决于人才和组织)。 与才华横溢、经验丰富的小型公司或单一开发人员签订契约(Contr
我对 Talend Open Studio for DI 非常陌生。我正在尝试从下面的 JSON 文件读取数据: { "data": [ { "id": "X999_Y999",
我已成功更新数据存储区。然后我关注了Google's instructions使用 Google Cloud Talent Solution。 但是当我运行我的函数之一时,这一行失败了: from g
错误: ... Caused by: java.lang.ExceptionInInitializerError ... Caused by: java.lang.ClassCastException
错误: ... Caused by: java.lang.ExceptionInInitializerError ... Caused by: java.lang.ClassCastException
将“com.google.cloud:google-cloud-talent:0.36.1”(从此处: https://cloud.google.com/talent-solution/job-sea
我是一名优秀的程序员,十分优秀!