首页 > 解决方案 > Java - NullPointerException即使在构造函数中设置了变量

问题描述

我已经编写了这段代码,但似乎即使设置了它也会引发 NullPointerException。这是代码(我知道我的代码根本不是面向未来或优化的。请不要对此发表评论)。我尝试将引用传递给 Main 方法,但这似乎不起作用。

MainTest.java

public class MainTest {
    public static void main(String[] args) {
        for (int i = 0; i < 500; i++) {
            Main main = new Main();
            main.run();
        }
    }
}

主.java

public class Main {
    Chicken[] chickenList = new Chicken[8388607];
    int counter = 0;

    public void run() {
        for (int i = 0; i < 4; i++) {
            chickenList[counter++] = new Chicken(Chicken.ADULT, this);
        }
        for (int i = 0; i <= 7200; i++) {
            for (Chicken chicken : chickenList) {
                if (chicken != null) {
                    if (chicken.getAdultOrBaby() == Chicken.ADULT) {
                        chicken.layEgg();
                    } else {
                        chicken.hasGrown();
                    }
                } else {
                    break;
                }
            }
        }
        System.out.println(amountOfChickens());
    }

    public void newChicken() {
        chickenList[counter++] = new Chicken(Chicken.CHILD, this);
    }

    public int amountOfChickens() {
        int amount = 0;
        for (Chicken chicken : chickenList) {
            if (chicken != null) {
                amount++;
            } else {
                return amount;
            }
        }
        return amount;
    }
}

鸡.java

import java.util.Random;

public class Chicken {
    Random random = new Random();
    private int timeAlive;
    private int timeSinceLastEgg;
    private int adultOrBaby;
    private int randomTimer;
    public static final int ADULT = 0;
    public static final int CHILD = 1;
    public static Main caller;

    public Chicken(int adultBaby, Main callers) {
        caller = callers;
        timeAlive = 0;
        timeSinceLastEgg = 0;
        adultOrBaby = adultBaby;
        if (adultOrBaby == ADULT) {
            randomTimer = newRandomTimer();
        }
    }

    public int getAdultOrBaby() {
        return adultOrBaby;
    }

    public void hasGrown() {
        if (++timeAlive == 1200) {
            adultOrBaby = ADULT;
        }
    }

    private int newRandomTimer() {
        return random.nextInt(300);
    }

    public void layEgg() {
        timeAlive++;
        if ((++timeSinceLastEgg) == (300 + randomTimer)) {
            new Egg(caller);
            timeSinceLastEgg = 0;
            randomTimer = newRandomTimer();
        }
    }
}

鸡蛋.java

import java.util.Random;

public class Egg {
    Main caller;
    Random random = new Random();
    private static final int WILL_HATCH = 2;
    private final int WILL_4 = 3;

    public Egg(Main callers) {
        if (random.nextInt(8) == WILL_HATCH) {
            if (random.nextInt(32) == WILL_4) {
                spawn4();
            } else {
                spawn();
            }
        }
        caller = callers;
    }

    private void spawn4() {
        for (int i = 0; i < 4; i++) {
            caller.newChicken();
        }
    }

    private void spawn() {
        caller.newChicken();
    }
}

这是输出:

Exception in thread "main" java.lang.NullPointerException
        at Egg.spawn(Egg.java:27)
        at Egg.<init>(Egg.java:14)
        at Chicken.layEgg(Chicken.java:40)
        at Main.run(Main.java:13)
        at MainTest.main(MainTest.java:5)

标签: javaclassmethods

解决方案


caller在调用后设置spawn(),这要求它已经设置。之前设置caller,它应该工作。


推荐阅读