这是一个有趣的Java问题。
以下简单的Java程序包含了一个由静态方法初始化的静态字段。实际上,我强制使计算初始化值的方法抛出NullPointException异常,当我访问这样一个静态字段时,会引发NoClassDefFoundError错误。似乎虚拟机将该类视为不完整。
但是当我访问该类时,它仍然可用。
有人知道原因吗?
class TestClass {
public static TestClass instance = init();
public static TestClass init() {
String a = null;
a.charAt(0); //force a null point exception;
return new TestClass();
}
}
class MainClass {
static public void main(String[] args) {
accessStatic(); // a ExceptionInInitializerError raised cause by NullPointer
accessStatic(); //now a NoClassDefFoundError occurs;
// But the class of TestClass is still available; why?
System.out.println("TestClass.class=" + TestClass.class);
}
static void accessStatic() {
TestClass a;
try {
a = TestClass.instance;
} catch(Throwable e) {
e.printStackTrace();
}
}
}
TestClass
。 - Arun P JohnyMainClass
中的TestClass.class
实际上持有对物理Class
对象的引用。如果类没有正确初始化,为什么我们可以接触它呢? - Ernest Friedman-HillTestClass.class
似乎不会触发类加载,并且看起来无论类是否已加载都可以访问/可用。 - Bala R