我有一个代码将类初始化为:
private static MyClass myObj = new MyClass();
我在下面的代码中使用myObj
。如果使用Java 6,就可以正常工作。但是当我使用Java 7时,会抛出NullPointerException
。
java.lang.NullPointerException
Exception in thread "main" java.lang.ExceptionInInitializerError
作为一种解决方法,我在使用它之前对myObj
进行了空检查并使其正常工作。
但是,如果Java 7实现中的任何更改导致静态初始化失败,我仍然感到困惑吗?
编辑:OpenAM发现了类似的问题。
答案 0 :(得分:2)
我们需要更多的代码示例和异常堆栈跟踪来进行诊断。
纯粹猜测,我知道在Java 7中,他们稍微改变了类初始化
https://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.2
对于每个类或接口C,都有一个唯一的初始化锁定LC。从C到LC的映射由Java虚拟机实现决定。初始化C的过程如下:
- 同步C的初始化锁定LC。这涉及等到当前线程可以获取LC。
醇>
这与以前的java不同,后者将类对象本身用作锁。
但是,它对你的案件负责是不太可能的。
答案 1 :(得分:0)
你可以尝试:
public class X {
private static MyClass myObj;
static {
myObj = new MyClass();
}
}
尽管静态方法通常用于执行多个操作