Java:获取Enums的ExceptionInInitializerError

时间:2014-12-11 21:00:29

标签: java pointers exception enums null

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

在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

1 个答案:

答案 0 :(得分:2)

您所体验的是“喜欢”递归。

发生此错误是因为代码PokemonEnum.values()位于枚举PokemonEnum中,当编译它时,它读取values()然后使用此内部函数,原始数据类型{{1}引用自己。但是,由于enum仍在编译中,enum的值为value()

注意:尝试使用其内部的null枚举将导致错误。因为value()是基本类型的一部分(意味着被调用的方法是{{},因此尝试使用if(PokemonEnum.values()!=null)或甚至尝试捕获ExceptionInInitializerError将无效。 1}} 的)。

解决方案values()置于枚举native的外部和下方。

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

类似来源:herehere

希望这有帮助。