0

オブジェクトの初期化の抜粋は次のとおりです。

    ...
            Rectangle b1 = tenBullets.getBounds();
    ...

getBounds()メソッドは次のとおりです。

public Rectangle getBounds() {
    return new Rectangle(x, y, 200, 25);
}

そして、ここにコンソールメッセージがあります:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at test.game.Board.checkCollisions(Board.java:75)
at test.game.Board.actionPerformed(Board.java:53)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Board.java:75は、getBounds()メソッドが呼び出されたときです。例外がスローされることもありますが、10回に1回はスローされません。修正はありますか?

4

2 に答える 2

0

NullPointerExceptionがスローされるのtenBulletsnull、そのメソッドが呼び出されたときであり、nullオブジェクトでメソッドを呼び出そうとしているためです(これは不可能であり、例外が発生します)。

これを修正するには、次の2つのいずれかを実行する必要があります。

  1. 前の動作を変更して、tenBullets呼び出す前に常に値が割り当てられるようgetBounds()にします。これは選択するオプションであり、この時点でnullになることはtenBulletsありません。
  2. 質問のコードをnullに耐性があるようにします-チェックif (tenBullets == null)し、これが当てはまる場合は別のアクションを実行します。これは、nullが適切な値であるかどうかを選択するオプションです(おそらく、初期化される場合とされない場合があります)。もしそうなら、あなたはその不測の事態に対処しなければなりません。

コードの意図またはコンテキストを理解しないと、具体的な推奨事項を提示することはできません。ただし、tenBulletsが(ローカル変数ではなく)フィールドである場合は、設定を解除(または変更)することが理にかなっているのかどうかを検討してください。そうでない場合は、それを宣言しfinalます。これにより、コンストラクター内で初期化され、その値が一貫して保持されることが保証されます。

一般に、可変フィールド/変数の数を減らすと、実行時にプログラムがどのような状態にあるかどうかをあまり意識する必要がないため、プログラムについて推論するのがはるかに簡単になります。それがここでのあなたの問題のように聞こえます。それtenBulletsは、ある時点で他のコードによって割り当てられており、明確な順序はありません。

于 2012-08-16T10:37:40.727 に答える
0

あなたが示したことから、私は確かに言うことはできませんが、ファイルとコードスニペットの名前を変更すると、Eclipseで不整合が発生することがあります。すべてが正しい場合でも、Eclipseはいくつかの古い名前をキャッシュしているため、競合する可能性があります。

これを解決するには、プロジェクト->クリーンアップに移動し、コンパイルされたすべてのファイルを削除します。

繰り返しますが、これがここでの問題かどうかはわかりませんが、以前に見たことがあります

于 2012-08-16T10:37:52.073 に答える