调用后,枚举变为空

时间:2011-01-29 14:25:12

标签: java multithreading enums nullpointerexception agents-jade

public Boolean performAction(AppleCollectorAgent agent, data.ActionType action)
{
    if(agent != null && action != null)
    {
        actions.put(agent, action);
    }
    else
    {
        System.out.println("GRID:  "+agent+" performs "+action+" TID: "+Thread.currentThread().getId()+". Time: "+ new Date().getTime());
        System.out.println("Either agent or action was null: "+agent+" - "+action);
    }
}

调用
ActionType ac = ActionType.ApplePickup;
System.out.println("AGENT: "+myAgent+" going to perform "+ac+" TID: "+Thread.currentThread().getId()+". Time: "+ new Date().getTime());
success = GridWorld.get().performAction((AppleCollectorAgent)myAgent, ac);

这适用于枚举Action的其他值,但对于值Action.PickupApple,actions.put会抛出NullPointerException。 当我放置一些println来显示参数的值时,它甚至更奇怪了。在调用之前,ac被打印为PickApple,而在performAction中,action被打印为null:

GRID:  Agents.GreedyAgent@1a42792 performs null TID: 29. Time: 1296317211796
Either agent or action was null: Agents.GreedyAgent@1a42792 - null
AGENT: Agents.GreedyAgent@1a42792 going to perform ApplePickup TID: 29. Time: 1296317211796

那么,在performAction中,动作如何变为空?

背景的一些解释: 对于多代理系统的课程,我必须模拟一个网格世界,其中代理人可以四处闲逛并拿起苹果。在每个模拟步骤中,每个代理可以执行一个操作。动作类型存储在枚举数据中。动作。 actions是ConcurrentHashMap,其中每个代理存储他想要执行的Action。当所有代理都这样做时,gridworld会处理所有这些并报告一个布尔值,表明操作成功。 每个代理都有自己的线程,gridworld也是如此。进一步下来performAction()有一些同步机制。 我首先想到的是多线程会出错,但我认为我可以放心,这不是问题所在。 action为null,这就是问题所在。

1 个答案:

答案 0 :(得分:1)

从评论中推断,我会说performAction被召唤两次。特别是如果它似乎“有时”工作。一旦将操作视为null,一次将操作视为PickApple。

如果是这种情况,您可以使用Thread.currentThread().getStackTrace()计算调用方法的位置。