【发布时间】:2014-07-01 07:10:37
【问题描述】:
我在一些静态类声明中遇到了一个奇怪的 NPE,我不知道为什么。
我有一个虚拟对象只是用来携带数据(是一个内部类),如下:
private static class MyStaticClass { //this is line 400
private String a;
private String b;
private String c;
private String d;
private Boolean flag1 = Boolean.FALSE;
private Boolean flag2 = Boolean.TRUE;
private Boolean flag3 = Boolean.TRUE;
private List<String> list = Collections.EMPTY_LIST;
public MyStaticClass() {}
public MyStaticClass(AnotherDataObject data) {
a = data.getA();
b = data.getB();
c = data.getC();
d = data.getD();
}
}
客户端代码(MyClass.myMethod)如下所示:
public class MyClass {
public void myMethod() {
Map<Key, MyStaticClass> thisMap = new HashMap<Key, MyStaticClass>(DEFAULT_BUFFSIZE);
//stuff
for() {
//stuff
MyStaticClass instance = new MyStaticClass(value1, value2, value3);
thisMap.put(generatedKey, instance);
}
//stuff
for() { //every key
MyStaticClass myStaticClassInstance = map.get(key); //this isn't null, i checked it.
if(randomObject.flag && myStaticClassInstance.flag2) {
//do stuff
}
}
//more stuff
}
private static class MyStaticClass {
//look the previous code snippet for more info
}
}
现在,我有一个线性运行(无并发)的函数,并在某些时候评估下一句:
if(randomObject.flag && myStaticClassInstance.flag2) //randomObject is another class
当 JVM 评估这句话时,在 MyStaticClass 声明(私有静态类...)处抛出 NPE,我不知道为什么。
没有静态块,flag2 永远不会设置为 null。
假设在第 400 行声明了“静态类 MyStaticClass”。所以,堆栈跟踪是这样的:
java.lang.NullPointerException
at org.mypackage.MyClass$MyStaticClass.access$1300(MyClass.java:400)
at org.mypackage.MyClass.myMethod(MyClass.java:283)
at org.mypackage.AsyncDestination$1.run(AsyncDestination.java:102)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
编辑:我添加了一个简单的测试,使用 MyStaticClass 作为 null (https://gist.github.com/anonymous/35b94fea2a993fc350e4),异常类似,但它被抛出在属性声明行,而不是声明类的行。
【问题讨论】:
-
为什么不把这些字段设为静态?
-
private static的类并没有什么特别之处,你得到一个 NPE 只是因为你取消了null的引用,就像代码中的其他任何地方一样。我建议你断点这段代码并在你的调试器中检查它。 -
@ScaryWombat 因为它实际上不是静态的。只是一个内部类。
-
@PeterLawrey myStaticClassInstance 是一个对象。假设我在第 400 行声明了静态类。堆栈跟踪表明 NPE 在第 400 行抛出 MyClass$MyStaticClass.access$1300。 .access 属性是什么?
-
private static有什么特殊原因,如果你有private类,你想从哪里访问它?
标签: java static nullpointerexception