-3

学校向けの非常にシンプルなシミュレーション文明ゲームをデザインしようとしています。現在、コントロール バーのこのボタンをクリックすると、新しい小屋のインスタンスが作成されるようにしようとしています。以下にエラーレポートとエラーが発生したコードを記載します。

エラーレポート:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at controls.Sidebar.clickBuildHut(Sidebar.java:102)
at screen_window.Game_Window.mouseClicked(Game_Window.java:248)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Window.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(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.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.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)

エラーが発生するコード:

public void newHut() {
        numOfHuts++;
        hut[numOfHuts] = new Hut(mouseX, mouseY, 0, numOfHuts);
}

クラスのトップでの小屋宣言:

Hut[] hut = new Hut[9999];
int numOfHuts;

Sidebar.clickBuildHut メソッド:

public boolean clickBuildHut(int mouseX, int mouseY){
    if (viewConstruction){
        int topLeftX = x + 2;
        int topLeftY = y + 50 - 14;
        int selectionWidth = width - 10;
        int selectionHeight = 17;
        for (int i = 0; i <= width; i++) {
            for (int h = 0; h <= height; h++) {
                if (mouseX == topLeftX + i && mouseY == topLeftY + h) {
                    first_map.setEditMode(true);
                    game_window.newHut();
                    return true;
                }
            }
        }
    }
    return false;
}

first_map.setEditMode:

public void setEditMode(boolean editMode) {
    this.editMode = editMode;
}

これが問題だとは思いませんが、これをtrueに切り替えると画像が正しく変化することがわかります。あなたが私にこれについてもっと情報を提供してほしいなら、私はできますが、問題がある場所ではないので、それは役に立たないと思います.

4

2 に答える 2

0

Sidebar.java の 102 行目を見つけます。NPE の場所であるスタック トレースに基づきます。あなたのコード投稿から、102行目は次のいずれかであると推測します。

first_map.setEditMode(true);

また

game_window.newHut();

これらがclickBuildHutメソッド内の唯一のオブジェクト参照であるためです。したがって、first_mapnull または null のいずれかですgame_window

于 2013-03-29T02:44:18.473 に答える
0

hut配列を初期化する場所は見当たりません。宣言しましたが、初期化していないため、Java のデフォルトはnullです。

どこかで、次のように初期化する必要があります。

hut = new Hut[size];

おそらくコンストラクターで。

編集

現在メソッドを表示している質問の編集に基づいて、clickBuildHutどの行が実際に 102 行であるかに応じて、first_mapまたはgame_windowですnull

于 2013-03-28T23:45:55.483 に答える