2

ここでtry catchパフォーマンスの他の投稿を読んだことは確かですが、私のポイントで使用しても問題ないかどうかはわかりません。
gameLoop のいくつかのポイントで使用しています。
初めに。私は libgdxStage and Actorシステムを使用しています。しかし、マップを変更すると、ステージをクリアすると、ステージでスローすることがありNullPointerExceptionます。

Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:202)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:166)
at com.portaaenigma.screens.GameScreen.render(GameScreen.java:91)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:202)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)

他の方法では処理できないため、単純な try catch を追加しました。ステータスで試してみたのですが、マップを変更してステージをクリアし、新しいモンスターを追加しながら、ステータスを別のものに変更します。しかし、実際には同じエラーが発生します。try キャッチは次のようになります。

    if (this.status == GameStatus.GAME) {
        try {
            this.figureStage.act(); // figures act <-- this is line 91
        } catch (NullPointerException e) {
            // catching nullpointer at mapchange
            Gdx.app.log(this.getClass().getSimpleName(),
                    "Nullpointer catched at mapswitch: " + e.getMessage());
        }
    }

私は多かれ少なかれ「修正」ソリューションのように見えるので、これで問題ないかどうか少し混乱しています。問題なく動作します。確かに、マップを変更すると時々スローされますが、理由はわかりません。
また、モンスターのルックアップ メソッドに try catch を追加する必要があります。モンスターでの衝突検出で範囲外になっている間にマップ変更に入ると。

さて、一般的な質問は、これが受け入れられる解決策であるか、それとももっと良い解決策があるべきかということです.

4

1 に答える 1

5

あなたが正しいです。これはハックです。ハックは進歩を助けるのに役立つかもしれませんが、ある時点で、NPEの原因を突き止める必要があります.

スタックを読み取り、NPE を含む行を見つけ、どのポインターが null であるかを特定し、それが null にならないようにする方法を見つけるか、そのコードが実行されないように分岐を追加します。

可能であれば null の代わりに有効なオブジェクトを使用する場合に役立つ1つのトリック。たとえば、存在しない人を検索している場合は、null の代わりに (自分で定義した) NOBODY オブジェクトを返します。ニュートラルな値ですべてのセレクター (get メソッド) をオーバーライドします。

于 2013-04-29T19:02:48.153 に答える