java - java 7 中的静态初始化

标签 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 也面临类似的问题.

最佳答案

我们需要更多代码示例和异常堆栈跟踪来进行诊断。

纯属猜测,我知道在 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:

  1. 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/

相关文章:

linux - JBoss 7 中的 UDP 连接在哪里配置?

java - 如何从 Java 中的 JSON 对象中删除所有 JSON 格式(不仅仅是空格)?

java - 在循环 Java 7 中转换泛型类型

java - 获取重载方法的方法句柄

java - GCP Spanner 中的动态查询生成器

java - 玩2.4,报错: package play. *不存在

java - 在 Maven 中,如何知道要从导入命令添加什么依赖项

Java IO——关闭输入流

java - 如何使用protobuf-gradle-plugin指定Protobuf路径

java - 如何防止Java为较新的SDK编译部分代码?