2014-02-13 23 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(); 
}