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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章