1

LibGDXとscene2dに慣れるために、単純なBreakOutクローンを作成しようとしています。ただし、非常に基本的な例を組み立てて自分自身を開始した後、非常に明確に定義されたオブジェクトでNullPointerExceptionが発生します。

私のプログラムには、パドルと呼ばれるインスタンスを持つパドルと呼ばれるActorクラスがあります。これはグローバル変数として宣言され、create()メソッドで初期化されます。プログラムを実行すると、コードのrender()メソッドでエラーが返され、パドルが画面の境界外にあるかどうかがチェックされます。

// make sure the paddle stays within the bounds of the screen
if(paddle.getX() < 0) paddle.setX(0); // <--- error is detected here
if(paddle.getX() > 800 - 200) paddle.setX(600);

返されるエラーは次のとおりです。

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.NullPointerException
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:111)
Caused by: java.lang.NullPointerException
    at com.freakout.Game.render(Game.java:150)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:190)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:108)

そして、これがパドルクラスです。

public class Paddle extends Actor {
TextureRegion region;
public Paddle(){
    region = new TextureRegion(new Texture(Gdx.files.internal("paddle.png")), 800/2 - 200 /2, 20);
    }
}

全体を見るのに役立つ場合のコードを次に示します。

編集:コメントのおかげで答えを見つけました:投稿直後に見逃していたことを認識しました-パドル変数のスコープを(パドルパドル=新しいパドル(...)を使用して)ローカルに再定義したようですグローバルではなくメソッド。したがって、オブジェクトにアクセスしようとすると、create()メソッドの外部ではオブジェクトにアクセスできなかったため、常にnullが返されました。

アクターが基本的な呼び出しで正しく機能しないという問題が発生している場合は、それが原因である可能性があります。

4

2 に答える 2

3

コードを調べたところ、create()メソッドで ""によってパドルを作成し、この行""new Paddle()のローカル変数""に割り当てていることがわかりました。したがって、実際には、このため、Gameクラスの ""という名前の変数は初期化されないままです(メソッドのローカル変数によって隠されているため)。したがって、メソッドでアクセスすると、が取得されます。paddlePaddle paddle = new Paddle();paddlerender()NullPointerException

このことを取り除くには、Paddle paddle = new Paddle();「この行を「」に変えるだけpaddle = new Paddle();で完了です。

于 2012-11-16T20:30:22.423 に答える
1

paddle変数がnullに割り当てられているか、初期化されていません。

于 2012-11-16T20:16:47.427 に答える