2012-07-24 5 views
0

저는 현재 Eric Robert의 Art and Science of Java을 통해 ACM Java 라이브러리를 사용하고 있습니다. 연습 중 하나는 학생이 브레이크 아웃의 클론을 구축하도록합니다. 오브젝트의 애니메이션에 문제가 있습니다. 따라서이 코드를 살펴보고 가능한 경우 공이 움직이지 않는 이유를 알려주십시오.Java/ACM : 왜 내 개체가 움직이지 않습니까?

이 코드 샘플은 내가 문제를 일으키는 동작을 격리하기 위해 작성했지만 전체 저녁 시간을 보낸 후 전혀 진전하지 않았기 때문에 도움을 요청하는 것이 좋습니다. 코드가 달성해야하는 것은 단순히 객체를 이동하는 것입니다. (참고 : 이것은 숙제 문제가 아닙니다.)

setup()에서 볼을 사용하여 캔버스를 설정하고 play()로 볼을 이동하려고하지만 아무 일도 일어나지 않습니다. http://pastebin.com/vy3rMrZw

package codeSamples_II; 

import acm.program.*; 
import acm.graphics.*; 


public class PlayBall extends GraphicsProgram { 

private static final int DELAY = 50; 
private GOval ball; 
private static final int BALL_RADIUS = 10; 

public void run() { 
    setup(); 
    play(); 
} 

private void setup() { 
    GOval ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2); 
    ball.setFilled(true); 
    add(ball); 
} 

public void play() { 
    while (ball.getY() < 200) { 
     ball.move(5, 5); 
     pause(DELAY); 
    } 
} 

}

덕분에 많은 :

또한 코드에 붙여되었습니다!

답변

1

오, 이런! 나는 처음에는 이걸 보지 못했다고 믿을 수 없다 ...

다음은 무슨 일입니까?

PlayBall 클래스가 인스턴스화되면 private GOval ball을 정의하십시오. 이것은 GOval 객체에 null 포인터 (값이없는 변수)를 생성합니다.

setup()GOval이라는 변수를 만들고 ball이라는 변수를 만듭니다. 이 사람은 귀하가 전 세계적으로 만든 사람의 다른입니다. 이 새로운 변수 ball은 로컬 변수 이며 setup() 메서드에만 존재합니다. 이 아닌이고 변수 ball과 동일합니다. 따라서 에서 ball을 이동하려고하면 변수 ball, setup()에서 만든 로컬 변수와 같지 않게 이동하려고합니다. 사실 전역 변수 ball은 결코 인스턴스화되지 않았고 (생성되지 않았거나 null), 따라서 실제로는 을 조작 할 수 없습니다. 이것이 널 포인터 오류를 얻는 이유입니다.

코드를 수정하려면 전역 변수가 새 공인 에 로컬 변수가 할당되지 않도록해야합니다. 수정하기 쉽습니다. 전에 식별자 을 제거하기 만하면됩니다. 코드는 다음과 같이 표시됩니다

package codeSamples_II; 

import acm.program.*; 
import acm.graphics.*; 


public class PlayBall extends GraphicsProgram { 

private static final int DELAY = 50; 
private GOval ball; 
private static final int BALL_RADIUS = 10; 

public void run() { 
    setup(); 
    play(); 
} 

private void setup() { 
    ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2); 
    ball.setFilled(true); 
    add(ball); 
} 

public void play() { 
    while (ball.getY() < 200) { 
     ball.move(5, 5); 
     pause(DELAY); 
    } 
} 
} 
당신은 여전히 ​​이해하지 않는 경우에 무슨 일이 일어나고 있는지의 더 나은 아이디어를 얻을 변수 범위 지정에 읽을 할 수 있습니다

.

+0

대단히 감사합니다. 갑자기 모든 것이 합리적입니다. – coltonpagefault

+0

기꺼이 도와 드리겠습니다! – dykeag