在交换机中构造对象时创建的java.lang.ExceptionInInitializerError

时间:2013-12-09 21:56:46

标签: java switch-statement runtime-error

在一个开关中,我在创建对象后创建一个Hive类的实例,它返回到我的开关并点击中断然后出现错误

Exception in thread "main" java.lang.ExceptionInInitializerError
    Caused by: java.lang.NullPointerException
at Garden.fileReader(Garden.java:141)
at Garden.<init>(Garden.java:28)
at Garden.<clinit>(Garden.java:10)'

在运行switch语句然后进入一个单独的类来构造对象之后发生错误,当返回并点击中断时会弹出错误

public class Garden {
    public static final Garden GARDEN = new Garden();   //line 10------------
    public static void main(String[] args) {


        int mainI = 0;
        while (mainI != 100) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
            }
            GARDEN.anotherDay();
            mainI++;
        }
    }
    static HashMap<String, Hive> HiveMap = new HashMap<String, Hive>();

    private Garden() {

        fileReader();   //line 28 --------------------------
        System.out.println("fileReader worked");
    }



    protected void fileReader() { // asks for file name for config file

        //removed try catch code that uses Scanner to get input from console
        // to select a file that is set to configFile

        Scanner configScanner = new Scanner(configFile);
        int k = 0;

        while (configScanner.hasNextLine() == true) {
            String inputLine = configScanner.nextLine();
            //removed long if statment to set k

            switch (k) {
            case 1:
                intFinder(k, inputLine);
                Hive hive = new Hive(honeyInput, pollenInput, royalJellyInput);
                HiveMap.put("hive" + hiveName, hive); line 141-------------
                break; // it gets to this break then throws the error

                // removed code
            default:
                break;
            }
        }
        cmdReader.close();
        configScanner.close();
    }

hive的构造函数是

protected Hive(int honeyStart, int royalJellyStart, int pollenStart)
{
    bees = new ArrayList<Bee>();
    this.setHoney(honeyStart);
    this.setRoyalJelly(royalJellyStart);
    this.setPollen(pollenStart);
}

很抱歉发布了这么多代码,但我唯一的想法是出现问题的是,当代码在另一个类中运行时,configScanner会丢失数据,而不是那样,我不知道出了什么问题,任何帮助都会非常感激< / p>

2 个答案:

答案 0 :(得分:2)

这是因为在Garden GARDEN的初始化程序运行时,HiveMap尚未初始化。将初始化HiveMap的行移至Garden GARDEN之前的一行以解决问题:

static HashMap<String, Hive> HiveMap = new HashMap<String, Hive>();
public static final Garden GARDEN = new Garden();

解决此问题的原因是静态初始化程序以文本顺序运行。 Garden()构造函数假定HiveMap为非null,因为它尝试将数据放入其中:

HiveMap.put("hive" + hiveName, hive);

答案 1 :(得分:1)

按顺序评估静态事物。在第10行,您尝试创建new Garden(),尝试访问静态成员HiveMap,但尚未初始化。只需将new Garden()移至main方法。