我有以下Java类:
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
方法,并为NullPointerException
行获得allTokens.put(...)
。为什么我会得到这个例外?
我的理解是静态ConcurrentMap
应该在我们访问putTokenData
方法时初始化,但在这里似乎并非如此。是否存在在初始化静态变量之前调用静态方法的情况?
答案 0 :(得分:3)
是否存在在初始化静态变量之前调用静态方法的情况?
是的,您可以从静态初始化程序块执行此操作。
static {
callMethod(); // this will blow up as `c` has not been initialized yet.
}
static final Collection c = ...;
static void callMethod() {
c.size();
}
答案 1 :(得分:2)
ConcurrentHashMap
不允许键值或值null
,与其他Map
实现不同:
与
Hashtable
类似,但与HashMap
不同,此类不允许null
用作键或值。
我怀疑token
或user
,而不是allTokens
,是null
的问题。
答案 2 :(得分:2)
由于NPE
,您未获得allTokens
。当调用该方法时,这肯定会被初始化。也许您将null
或token
的{{1}}值传递给该方法。 user
不允许ConcurrentHashMap
为密钥或值。
查看ConcurrentHashMap#put()
方法的文档:
<强>抛出:强>
null
- 如果指定的键或值为null
答案 3 :(得分:0)
您的statica变量已初始化,您在评论中写的问题是token
, hasmap的键是null
..
密钥不能为空!!
请阅读此处ConcurrentHasMap guide,您可以阅读:此类不允许将null用作键或值。
答案 4 :(得分:0)
javadoc 说:“抛出:NullPointerException - 如果指定的键或值为null”