我有一个将类初始化为的代码:
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 也面临类似的问题.
最佳答案
我们需要更多代码示例和异常堆栈跟踪来进行诊断。
纯属猜测,我知道在 Java 7 中,他们稍微改变了类初始化
https://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.2
For each class or interface C, there is a unique initialization lock LC. The mapping from C to LC is left to the discretion of the Java Virtual Machine implementation. The procedure for initializing C is then as follows:
- Synchronize on the initialization lock, LC, for C. This involves waiting until the current thread can acquire LC.
这与以前的java不同,以前的java使用类对象本身作为锁。
不过,它不太可能对你的情况负责。
关于java - java 7 中的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30225240/