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行.