[英]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的過程如下:
- 在初始化鎖LC上為C同步。這涉及等待直到當前線程可以獲取LC。
這與以前的java不同,在java中,類對象本身用作鎖。
不過,它不太可能對您的案件負責。
您可以嘗試:
public class X {
private static MyClass myObj;
static {
myObj = new MyClass();
}
}
通常,靜態方法通常用於執行多種操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.