编辑:解决了,但是我不明白为什么
在PokemonEnum中,我有这条线
private PokemonEnum[ ] pokemon = PokemonEnum.values();
我将其更改为:
private static PokemonEnum[ ] pokemon = PokemonEnum.values();
现在可以了。我什至从未使用过该数组,所以我不知道为什么会出错或为什么静态要修复它。
我还没有真正与Enums一起工作,所以我真的不知道为什么在运行main时为什么会出现ExceptionInInitializerError(尝试创建新的Pokemon时在第28行)。有人在乎解释吗?谢谢。
import java.awt.image.BufferedImage;
import java.util.ArrayList;
public class Pokemon {
private PokemonEnum name;
private int dexNumber;
private BufferedImage sprite;
private TypeEnum[] types = new TypeEnum[1];
private ArrayList<AbilityEnum> abilities;
private ArrayList<MoveEnum> moves;
private short hp;
private short attack;
private short defense;
private short special_attack;
private short special_defense;
private short speed;
public Pokemon(PokemonEnum name)
{
this.name = name;
this.dexNumber = name.getDexNum();
}
public static void main(String[] args)
{
Pokemon pikachu = new Pokemon(PokemonEnum.Pikachu);
System.out.println(pikachu.dexNumber);
}
}
public enum PokemonEnum {
Pikachu;
public int getDexNum()
{
return ordinal()+1;
}
private PokemonEnum[ ] pokemon = PokemonEnum.values();
}
Stack Trace:
Exception in thread "main" java.lang.ExceptionInInitializerError
at Pokemon.main(Pokemon.java:28)
Caused by: java.lang.NullPointerException
at PokemonEnum.values(PokemonEnum.java:1)
at PokemonEnum.<init>(PokemonEnum.java:722)
at PokemonEnum.<clinit>(PokemonEnum.java:2)
... 1 more
最佳答案
您所经历的就像是“递归”。
发生此错误的原因是代码PokemonEnum.values()
位于枚举PokemonEnum
中,并且在编译时将读取values()
,然后使用此内部函数,原始数据类型enum
引用了自身。但是,由于enum
仍在编译中,因此value()
的值为null
。
注意:尝试在枚举内部使用value()
会导致错误。由于if(PokemonEnum.values()!=null)
是原始类型的一部分,因此尝试使用ExceptionInInitializerError
甚至试图捕获values()
均无效(这意味着被调用的方法是native
)。
解决方案是将private PokemonEnum[] pokemon = PokemonEnum.values();
放在枚举PokemonEnum
的外部和下方。
我从个人经验以及类似问题的其他来源了解到这一点。
相似来源:here和here
希望这可以帮助。