0

PC 用の Breakout のクローンを作成しています。今夜の早い時間に、NullPointerException がスローされ、コンソールに表示されていることがわかりました。奇妙なことに、このメソッドrun()は、発生するすべての例外をキャッチしてスタックトレースを表示し、それらを無視するように指示されますが、今回は開始時にゲームをフリーズさせ、ログを記録し、キープレスは引き続き追跡されますが、ゲーム内では何も起こりません。明らかに、ゲームは中止されませんでしたが、再描画されません。

1行のコードから来ているようです:

 if (by >= bricks[0].y && by <= bricks[0].y + bricks[0].img.getHeight(null) && bx >= bricks[0].x && bx <= bricks[0].x + bricks[0].img.getWidth(null)) {

ログとスタックトレース (全体) は次のとおりです。

Game starting, menu boot.
Menu Loaded, JFrame visible.
Running thread.
Play clicked, start game initialization.
Creating JFrame.
JFrame created and visible.
Starting game thread
Initialize user variables.
Initialized user variables.
Initialization complete, start game.
java.lang.Execption in line 86/87, class Game. Stacktrace:
java.lang.NullPointerException
    at Game.move(Game.java:195)
    at Game.run(Game.java:86)
    at java.lang.Thread.run(Thread.java:722)
Space hit!
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT released.
Key ESCAPE Hit!

この問題が解決できることを願っています。

4

2 に答える 2

2

その「行」を見てみましょう:

   if (by >= bricks[0].y && 
       by <= bricks[0].y + bricks[0].img.getHeight(null) && 
       bx >= bricks[0].x && 
       bx <= bricks[0].x + bricks[0].img.getWidth(null)) {

bxbyxおよびyフィールドがすべてプリミティブ型 (例: ) であると仮定すると、NPE になる可能性intのあるもののリストは次のとおりです。

  • bricks変数はnull
  • のゼロ番目の要素bricksnull
  • の値bricks[0].imgnull

bxbyxおよび/またはyがラッパー型の場合、そのうちの 1 つが である可能性がありますnull。これは、値のボックス化を解除するときに NPE につながります。

またはメソッドに渡すnullことによって引き起こされるわけではありません.1)それが有効であると信じており、2)そうでない場合、スタックトレースが示すものとは別の場所にNPEがスローされるためです。getHeightgetWidth

null(これらの呼び出しを渡すことが正しいかどうかはわかりません...しかし、いずれにせよ、あなたが提供した証拠に基づいて、このNPEの原因ではありません。)


問題の実際の原因を突き止めたい場合は、コードをデバッグするか、いくつかのトレースプリントを追加して、実際に何が問題であるかをテストします。nullnull

于 2013-09-04T00:27:58.087 に答える
0

この回答は、brick[0].img のタイプが java.awt.Image であることを前提としています。getHeight メソッドと getWidth メソッドの両方で ImageObserver を null に設定しています。実際に画像をどこかに表示したい場合は、その画像を ImageObserver として配置する必要があります。

http://docs.oracle.com/javase/7/docs/api/java/awt/image/ImageObserver.html

Button、Panel、または画像を配置しようとしている場所は、おそらく getWidth メソッドと getHeight メソッドに渡される必要があります。これは、ImageObserver インターフェイスを実装している可能性が高いためです。

于 2013-09-04T00:28:08.230 に答える