package com.java.oop;
import java.util.HashMap;
import java.util.Map;
class ClassE{
static ClassE instance=new ClassE();
static Map<String,Object> pool=new HashMap<>();
public ClassE() {
pool.put("A", "100");
pool.put("B", "200");
}
}
public class TestClassObject05 {
public static void main(String[] args) {
System.out.println(ClassE.pool);
}
}
运行,出现空指针异常:
[Loaded com.java.oop.ClassE from file:/D:/WORKSPACE/JAVASE-V1.01/bin/]
[Loaded java.lang.ExceptionInInitializerError from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
Exception in thread "main" [Loaded java.lang.Throwable$PrintStreamOrWriter from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.util.IdentityHashMap from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.util.IdentityHashMap$KeySet from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
java.lang.ExceptionInInitializerError
at com.java.oop.TestClassObject05.main(TestClassObject05.java:14)
Caused by: java.lang.NullPointerException
at com.java.oop.ClassE.<init>(TestClassObject05.java:8)
at com.java.oop.ClassE.<clinit>(TestClassObject05.java:5)
... 1 more
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_201\lib\rt.jar]
分析:调用类的成员变量pool时,类初始化,首先执行第5行,第5行new实例,跳到第7行执行构造方法,构造方法中使用了第6行的pool变量,但是此时未执行第6行,pool变量为null,从而导致执行构造方法的时候报空指针异常.
如何改?
方法1:第5行代码
static ClassE instance=new ClassE();
与第6行代码
static Map<String,Object> pool=new HashMap<>();
交换顺序,即:
package com.java.oop;
import java.util.HashMap;
import java.util.Map;
class ClassE{
static Map<String,Object> pool=new HashMap<>();
static ClassE instance=new ClassE();
public ClassE() {
pool.put("A", "100");
pool.put("B", "200");
}
}
public class TestClassObject05 {
public static void main(String[] args) {
System.out.println(ClassE.pool);
}
}
方法2:第5行去掉static,main方法中ClassE.instance.pool调用
package com.java.oop;
import java.util.HashMap;
import java.util.Map;
class ClassE{
static ClassE instance=new ClassE();
Map<String,Object> pool=new HashMap<>();//去掉static
public ClassE() {
pool.put("A", "100");
pool.put("B", "200");
}
}
public class TestClassObject05 {
public static void main(String[] args) {
System.out.println(ClassE.instance.pool);
}
}
此时执行到第5行时,new实例化,pool此时是实例变量,按顺序执行到第6行,然后执行第7行.