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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值