2014-02-13 22 views
0

我有以下的Java類:爲什麼我的靜態變量var在通過靜態方法訪問時未初始化?

public class CWTokenMap { 
    public static ConcurrentMap<String, String> allTokens 
     = new ConcurrentHashMap<String, String>(); 

    public static void putTokenData(final String token, final String user) { 
     allTokens.put(token, user); 
    } 
} 

當我運行我的應用程序,我試圖從另一個類訪問putTokenData方法,我也得到了行allTokens.put(...)一個NullPointerException。爲什麼我會得到這個異常?

我的理解是,在我們訪問putTokenData方法時應該初始化靜態ConcurrentMap,但這裏似乎並非如此。是否有在初始化靜態變量之前調用靜態方法的情況?

+4

'token' null? –

+0

你的'user'或'token'是'null'嗎? –

+0

是的,在我測試的情況下令牌爲空。我將用非空的標記進行測試。 – MRenauld

回答

2

由於allTokens,您沒有得到NPE。當該方法被調用時,肯定會被初始化。也許你將null的值傳遞給方法tokenuserConcurrentHashMap不允許null作爲鍵或值。

檢查ConcurrentHashMap#put()方法的文檔:

拋出:
NullPointerException - 如果指定鍵或值爲null

+1

真的應該是'IllegalArgumentException'。 : -/ – chrylis

+0

@chrylis我也覺得這樣。 –

2

ConcurrentHashMap不允許任何鍵或值爲null,不像其他一些Map實現:

Hashtable但不像HashMap,這個類確實允許null被用作鍵或值。

我懷疑tokenuser,不allTokens,是有問題的null

0

此致statica變量初始化,問題是你寫的在評論中是token,hasmap的關鍵null ..

密鑰不能爲空!!

在這裏閱讀ConcurrentHasMap guide,你可以閱讀:該類不允許將null用作鍵或值。

0

javadoc 說:「拋出:NullPointerException - 如果指定鍵或值爲null」

3

是那裏的靜態方法將初始化靜態變量之前被調用的情況?

是的,你可以從一個靜態初始化塊中做到這一點。

static { 
    callMethod(); // this will blow up as `c` has not been initialized yet. 
} 

static final Collection c = ...; 

static void callMethod() { 
    c.size(); 
}