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, а в executeAction действие печатается как 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
Итак, как действие может стать пустым в executeAction?
Некоторое объяснение на фоне: для курса по мультиагентным системам я должен сделать симуляцию мира сетки, в которой агенты могут бродить и собирать яблоки.На каждом этапе моделирования каждый агент может выполнить одно действие.Типы действий хранятся в данных перечисления. Действие.actions - это ConcurrentHashMap, в котором каждый агент сохраняет действие, которое он хочет выполнить.Когда все агенты сделали это, gridworld обрабатывает все это и сообщает логическое значение, указывающее на успешность действия.Каждый агент имеет свой собственный поток, как и gridworld.Далее в executeAction () есть несколько механизмов синхронизации.Сначала я подумал, что многопоточность пошла не так, но я думаю, что могу смело утверждать, что проблема не в этом.действие нулевое, вот в чем проблема.