2012-03-13 7 views
0

기본적으로, 나는 충돌 탐지를위한 기본적인 방법을 가지고 있으며, 때로는 애플릿을 실행할 때 작동하지만, 대부분의 경우 그것은 수행한다. 다음은 오류 및 일부 코드입니다.때때로이 오류가 발생하는 이유는 무엇입니까?

Exception in thread "Thread-3" java.lang.NullPointerException 
at zombies.Main.checkCollision(Main.java:110) 
at zombies.Main.run(Main.java:140) 
at java.lang.Thread.run(Unknown Source) 

    public void checkCollision(){ 
    if(player.playerRect.intersects(platform.platformRect)){ // line 110 

     player.dy = 0; 
     player.y = (platform.y - player.height); 
     player.isTouching = true; 
    } 

.... 

    @Override 
public void run() { 
    try { 
     while(true){ 

     checkCollision(); // line 140 
     player.move(); 

     Thread.sleep(15); 

어떤 도움을 주시면 감사하겠습니다! 미리 감사드립니다!

+3

내 추측은 다중 스레드 응용 프로그램의 공유, 가변 데이터 동기화의 부족이 될 것입니다 발생합니다. – duffymo

+0

빠른 답장을 보내 주셔서 감사합니다. 그러나 어떻게 해결할 수 있습니까? – hazard1994

+1

먼저'player','player.playerRect' 또는'null' 인'platform'인지 여부를 알아야합니다. 우리는 충분한 정보를 얻지 못했습니다. –

답변

1

대답은 player, player.playerRect 또는 platformnull입니다.

정확히 어떤 것이 널인지 알아 내려면 별도의 검사로 분리해야합니다 (또는 디버거에 중단 점과 함께 멈춤). 이 같은

점검을 분리하려면 코드가 보일 것이다 뭔가 :

if (player == null) { 
    throw new NullPointerException("player is null"); 
} 
if (player.playerRect == null) { 
    throw new NullPointerException("player.playerRect is null"); 
} 
if (platform == null) { 
    throw new NullPointerException("platform is null"); 
} 

이것은 당신이 null되는 객체 결정하기 위해 예외를 볼 수 있습니다. 그런 다음 코드를 검사하여 해당 객체가 null로 설정되는 이유를 찾아 상황을 수정할 수 있습니다.

또는 일 수 있기 때문에 NullPointerException을 던지는 대신 코드의 해당 부분을 무시할 수 있습니다.

즉, 여러 스레드를 처리하고 있으며 문제가 가끔 발생하는 경우 자바의 잠금, 동기화 및 기타 동시성 도구를 살펴 봐야합니다. 그렇지 않으면 하나의 스레드가 객체가 null인지 확인하고 그 비교 후에 결과에 대한 조치를 취하기 전에 다른 스레드가 객체를 변경하는 상황이 발생할 수 있습니다.

것은 이러한 일련의 이벤트가 상상 :

  • 스레드 검사를하고 player이 스레드 B 실행하지 null
  • 이며 null
  • 나사 스레드와 player을 대체 것을 발견 실행되면서 player이 아닌 것으로 생각하면 null이 그 playerRect 회원 CCESS하지만 지금 null 때문에, NullPointerException
+0

수표를 어떻게 분리합니까? – hazard1994

+0

그런데 도움에 감사드립니다 – hazard1994

+0

정말 고마워요 !! – hazard1994

관련 문제