Java類初始化順序改錯

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

發佈了37 篇原創文章 · 獲贊 4 · 訪問量 1260
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章