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.PickupApple 들어 actions.put는 NullPointerException이 발생. 인자 값을 표시하기 위해 println을 여러 개 넣으면 더 이상해 보입니다. 호출하기 전에, 교류는 PickApple로 인쇄되며, performAction에서, 작업이 널 (null)로 인쇄됩니다 :
그래서GRID: [email protected] performs null TID: 29. Time: 1296317211796
Either agent or action was null: [email protected] - null
AGENT: [email protected] going to perform ApplePickup TID: 29. Time: 1296317211796
, 어떻게 조치가 performAction에 널 (null)이 될 수있다?
배경에 대한 설명 : 멀티 에이전트 시스템에서의 과정을 위해 , 나는 에이전트가 방황하고 사과를 집을 수있는 그리드 월드 시뮬레이션을 만들어야합니다. 각 시뮬레이션 단계에서 각 상담원은 하나의 작업을 수행 할 수 있습니다. 작업 유형은 enum data.Action에 저장됩니다. actions는 ConcurrentHashMap입니다. ConcurrentHashMap에서는 각 에이전트가 원하는 작업을 저장합니다. 모든 에이전트가 작업을 완료하면 그리드 월드가 모든 작업을 처리하고 작업의 성공을 나타내는 부울을 다시보고합니다. 각 에이전트에는 gridworld와 마찬가지로 자체 스레드가 있습니다. performAction() 아래에는 몇 가지 동기화 메커니즘이 있습니다. 처음에는 모든 것이 잘못되어 멀티 스레딩이 될 것이라고 생각했지만 문제가 아닐 수 있다고 생각합니다. 액션이 null 인 경우, 이것이 문제입니다.
'Action.PickupApple'을'ac' 대신에 메서드 호출에서 직접 인수로 전달하면 어떻게됩니까? 'action' 매개 변수가 여전히 null로 인쇄됩니까? –
'data.Action'은 무엇을 의미합니까? 표준 협약에 따르면, 데이터는 유형이 없으므로'data.Action'은 의미가 없습니다. 나는 이상한 것들을 찾기 전에 그것을 청소할 것이다. '행동'은 무효화 된지도인가? – maaartinus
@maaartinus'data'는 패키지 이름이 될 것입니다. –