Java - NullPointerExceptioneven when variable has been set in constructor : <p>I have made this code, but it seems that it throws a NullPointerException even when it has been set.
This is the code (I am aware my code is not future proof or optimised at all. Please do not comment about it). I have tried passing the reference to the method Main, but that doesn't seem to work.</p>

<p>MainTest.java</p>

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

<p>Main.java</p>

<pre><code>public class Main {
    Chicken[] chickenList = new Chicken[8388607];
    int counter = 0;

    public void run() {
        for (int i = 0; i &lt; 4; i++) {
            chickenList[counter++] = new Chicken(Chicken.ADULT, this);
        }
        for (int i = 0; i &lt;= 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;
    }
}
</code></pre>

<p>Chicken.java</p>

<pre><code>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();
        }
    }
}
</code></pre>

<p>Egg.java</p>

<pre><code>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 &lt; 4; i++) {
            caller.newChicken();
        }
    }

    private void spawn() {
        caller.newChicken();
    }
}
</code></pre>

<p>And this is the output:</p>

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