编辑:解决了,但是我不明白为什么

在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的外部和下方。

我从个人经验以及类似问题的其他来源了解到这一点。

相似来源:herehere

希望这可以帮助。

09-06 22:52