0

私は現在、ACMJavaライブラリを使用するEricRobertのArtand ScienceofJavaを使用しています。演習の1つでは、生徒にBreakoutのクローンを作成させます。オブジェクトのアニメーションに問題があるので、このコードを見て、可能であればボールが動かない理由を教えてください。

これは私が問題を引き起こしている振る舞いを分離するために書いたコードサンプルですが、それで一晩中過ごした後、私はまったく進歩していなかったので助けを求めたほうがいいと思いました。コードが達成することになっているのは、単にオブジェクトを移動することです。(注:これは宿題の問題ではありません。)

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);
    }
}

}

どうもありがとう!

4

1 に答える 1

1

ああ、当たり前!初めて見なかったなんて信じられない…

これが起こっていることです。

PlayBallクラスがインスタンス化されると、定義します private GOval ball。これにより、GOvalオブジェクトへのnullポインター(値を持たない変数)が作成されます。

で、という名前の新しい変数setup()を作成します。これは、グローバルに作成したものとは異なります。名前が付けられたこの新しい変数はローカル変数であり、メソッドにのみ存在します。グローバル変数と同じではありません。したがって、を移動しようとすると、グローバル変数を移動しようとします。これは、で作成したローカル変数とは異なります。実際、グローバル変数はインスタンス化されなかった(作成されなかった、またはnull)ため、実際に操作することはできません。これが、nullポインタエラーが発生する理由です。 GOvalballballsetup()ballplay()ballballsetup()ball

コードを修正するには、ローカル変数ではなく、グローバル変数が新しいボールに割り当てられていることを確認する必要があります。修正するのは簡単です。GOval前に識別子を削除する必要がありますball = new Goval( ... )。コードは次のようになります。

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);
    }
}
}

それでも理解できない場合は、変数のスコープを調べて、何が起こっているのかをよりよく理解することをお勧めします。

于 2012-07-25T12:54:01.390 に答える