java 7中的静态初始化

时间:2015-05-13 21:08:58

标签: java java-7

我有一个代码将类初始化为:

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发现了类似的问题。

2 个答案:

答案 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的过程如下:

     
      
  1. 同步C的初始化锁定LC。这涉及等到当前线程可以获取LC。
  2.   

这与以前的java不同,后者将类对象本身用作锁。

但是,它对你的案件负责是不太可能的。

答案 1 :(得分:0)

你可以尝试:

public class X {

   private static MyClass myObj;

   static {
      myObj = new MyClass();
   }

}

尽管静态方法通常用于执行多个操作