为什么我的静态var在通过静态方法访问时未初始化?

时间:2014-02-13 16:48:31

标签: java static

我有以下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方法时初始化,但在这里似乎并非如此。是否存在在初始化静态变量之前调用静态方法的情况?

5 个答案:

答案 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用作键或值。

我怀疑tokenuser,而不是allTokens,是null的问题。

答案 2 :(得分:2)

由于NPE,您未获得allTokens。当调用该方法时,这肯定会被初始化。也许您将nulltoken的{​​{1}}值传递给该方法。 user不允许ConcurrentHashMap为密钥或值。

查看ConcurrentHashMap#put()方法的文档:

  

<强>抛出:
  null - 如果指定的键或值为null

答案 3 :(得分:0)

您的statica变量已初始化,您在评论中写的问题是token hasmap的键null ..

密钥不能为空!!

请阅读此处ConcurrentHasMap guide,您可以阅读:此类不允许将null用作键或值。

答案 4 :(得分:0)

javadoc 说:“抛出:NullPointerException - 如果指定的键或值为null”