簡體   English   中英

Java 7中的靜態初始化

[英]Static initialization in 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之前先對其進行空檢查,然后使其myObj

但是我仍然很困惑Java 7實現中是否有任何使靜態初始化失敗的更改?

編輯 :發現OpenAM面臨類似的問題。

我們將需要更多代碼示例和異常stacktrace進行診斷。

純粹的猜測,我知道在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. 在初始化鎖LC上為C同步。這涉及等待直到當前線程可以獲取LC。

這與以前的java不同,在java中,類對象本身用作鎖。

不過,它不太可能對您的案件負責。

您可以嘗試:

public class X {

   private static MyClass myObj;

   static {
      myObj = new MyClass();
   }

}

通常,靜態方法通常用於執行多種操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM