java - 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)
解决方案
您caller
在调用后设置spawn()
,这要求它已经设置。之前设置caller
,它应该工作。
推荐阅读
- react-native - 渲染标记问题 | 反应原生
- prolog - 家谱/3序言
- c - isdigit 类似函数,适用于浮点数
- vb.net - 在子例程中退出 Select Case
- xslt - 如何使用 xslt 获取行跨度
- php - 如何使用 Vuetables VUE.JS 在每一行上添加 HREF 链接
- sql - 如何根据公司角色、windowsform Visual Studio 控制用户看到的内容?
- apache-spark-sql - 在 Spark-SQL 满载或增量加载中哪个更好
- ios - CLLocationManager 实例方法不会强制定位服务开启多次
- css - 从不同页面引用特定类