Enum становится нулевым после вызова - PullRequest
0 голосов
/ 29 января 2011
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 () есть несколько механизмов синхронизации.Сначала я подумал, что многопоточность пошла не так, но я думаю, что могу смело утверждать, что проблема не в этом.действие нулевое, вот в чем проблема.

1 Ответ

1 голос
/ 29 января 2011

Исходя из комментариев, я бы сказал, что performAction вызывается дважды. Особенно, если кажется, что «иногда» работает. Один раз с действием, равным нулю, и один раз с действием как PickApple.

Если это так, вы можете использовать Thread.currentThread().getStackTrace() для определения места вызова метода.

...