在一个开关中,我在创建对象后创建一个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>
答案 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
方法。