0

よし、ここに最初に投稿するので、私が何か間違ったことをしている場合は怒鳴ってください。しかし、私は次のコードを持っています。その試みは、それらの古い学校のサークルの泥の 1 つに対してゾーンビルダーのような取引を行うことです。ただし、ヌル ポインター エラーが発生し続けます。私はこの問題について何時間もググって修正してきましたが、何か他のことを試す時が来たと思います:P

その目的は、部屋のインスタンスを格納する 3D 配列を作成することです。泥の部屋に精通している場合は、接辞のリストがあり、特にこれには、グラフィックのアートタグを渡す個々の部屋の座標の 3 次元グリッドがあります。次に配列を使用して、部屋の出口ステータスに基づいたラベル画像を使用して、JPanel で各高度のフロアの 2D グリッドを表示します。問題は、次のいずれかにあるようです。コンストラクターが私の変数を設定していませんが、これはありそうもないようです b. 私はそれを間違って使用しています(Javaに精通していないため、おそらくそうです)またはc. 本当に簡単な間違いを見落としています。

Rooms クラス内の変数にアクセスしようとすると、常にエラーが発生します。

package battle.org;

public class GUI extends JFrame {

public class Rooms{
    String Rt;
    String desc;
    boolean dark;     
    boolean indoors;    
    boolean nomob;      
    boolean peace;      
    boolean soundproof;
    boolean notrack;
    boolean nomag;
    boolean tunnel;
    boolean notify;     
    boolean SF;         
    boolean FF;         
    boolean noport;     
    boolean noquit;     
    boolean exitu;      
    boolean exitd;      
    boolean onmap;      
    boolean exitud;     
    boolean exite;      
    boolean exitw;      
    boolean exits;     
    boolean exitn;

    public Rooms(){
        String Rt   = "Room Name";
        String desc = "Default Description";
        dark       = false;
        indoors    = false;
        nomob      = false;
        peace      = false;
        soundproof = false;
        notrack    = false;
        nomag      = false;
        tunnel     = false;
        notify     = false;
        SF         = false;
        FF         = false;
        noport     = false;
        noquit     = false;
        exitu      = false;
        exitd      = false;
        onmap      = false;
        exitud     = false;
        exite      = false;
        exitw      = false;
        exits      = false;
        exitn      = false;
    }       
}

private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI frame = new GUI();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public GUI() {

    final int MAXxy = 10;
    final int MAXz  = 1;
    int z;
    Rooms[][][] a = new Rooms[MAXxy][MAXxy][MAXz];
//  for(int x = 0; x < MAXxy; x++){
//      for(int y = 0; y < MAXxy ; y++){
//          for(z = 0; z < MAXz; z++){
//              a[x][y][z] = new Rooms(); 
//          }
//      }
//  }

//Labels to be displayed in grid
JLabel room = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\room.jpg"));
JLabel nothing = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\empty.jpg"));
JLabel up = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\up.jpg"));
JLabel down = new JLabel(new ImageIcon("C:\\Users\\Owner\\Desktop\\down.jpg"));


            //Error here wont let me access the boolean
    a[0][0][0].onmap = true;
    int x, y;
    x =0; y =0; z = 0;
    if(a[0][0][0].onmap){
        System.out.print("X = " + x + " Y = " + y + " Z = " + z + "");
        contentPane.add(down,  new GridBagConstraints(x, y, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
    }


    //Displays Altitude level z
    z = 0;
/*  for(int x = 0; x < MAXxy; x++){
        for(int y = 0; y < MAXxy ; y++){
            if(a[0][0][0].onmap){
                contentPane.add(down,  new GridBagConstraints(x, y, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
            }
        }
    }*/
}
}

エラーのリスト:

java.lang.NullPointerException
    at battle.org.GUI.<init>(GUI.java:189)
    at battle.org.GUI$1.run(GUI.java:77)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(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)
4

2 に答える 2

1

Room オブジェクトで埋める部分をコメントアウトしたため、配列は null でいっぱいです。

于 2013-05-21T00:16:28.017 に答える
0

問題は次のとおりです。Rooms[][][] a配列を初期化しますが、その中の値を初期化しません。したがって、この行の実行

a[0][0][0].onmap = true;

になりますNullPointerException

配列内の要素を必ず初期化してください。基本的な例:

for(int i = 0; i < MAXxy;i++) {
    for(int j = 0; j < MAXxy; j++) {
        for(int k = 0; k < MAXz; k++) {
            a[i][j][k] = new Rooms();
        }
    }
}

ところで、同様のコードがありますが、コメントされています。コメントを外すか、提供されたコードを使用してください。

于 2013-05-21T00:16:53.037 に答える