在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
答案 0 :(得分:2)
您所体验的是“喜欢”递归。
发生此错误是因为代码PokemonEnum.values()
位于枚举PokemonEnum
中,当编译它时,它读取values()
然后使用此内部函数,原始数据类型{{1}引用自己。但是,由于enum
仍在编译中,enum
的值为value()
。
注意:尝试使用其内部的null
枚举将导致错误。因为value()
是基本类型的一部分(意味着被调用的方法是{{},因此尝试使用if(PokemonEnum.values()!=null)
或甚至尝试捕获ExceptionInInitializerError
将无效。 1}} 的)。
解决方案将values()
置于枚举native
的外部和下方。
我从个人经验以及类似问题的其他来源了解到这一点。
希望这有帮助。