0
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 인 경우, 이것이 문제입니다.

+0

'Action.PickupApple'을'ac' 대신에 메서드 호출에서 직접 인수로 전달하면 어떻게됩니까? 'action' 매개 변수가 여전히 null로 인쇄됩니까? –

+0

'data.Action'은 무엇을 의미합니까? 표준 협약에 따르면, 데이터는 유형이 없으므로'data.Action'은 의미가 없습니다. 나는 이상한 것들을 찾기 전에 그것을 청소할 것이다. '행동'은 무효화 된지도인가? – maaartinus

+0

@maaartinus'data'는 패키지 이름이 될 것입니다. –

답변

1

의견에서 제외되면 performAction이 두 번 호출됩니다. 특히 "때때로"일하는 것 같다면. 한 번은 액션을 null로, 한 번만 액션을 PickApple로 사용합니다.

이 경우 Thread.currentThread().getStackTrace()을 사용하여 메서드가 호출 된 곳부터 해결할 수 있습니다.

+1

그건 그랬어. null ActionType을 사용하여 PerformAction을 시도한 전혀 다른 동작이있었습니다. 당신은 하루 종일 당신을 괴롭히는 느낌이 들었고 정말 간단하다는 것을 알았습니까? 나는 그것을 가지고있다. ... – Loy

+0

그렇게 초조해한다. 모든 도움 주셔서 감사합니다. – Loy