Java - 如何将table [i] [j]元素声明为实例变量?

时间:2010-03-28 16:46:31

标签: java

所有

我正在尝试编写Connect4游戏。为此,我创建了一个P4Game类和一个P4Board类,它代表了Connect4板的i X j尺寸。

在P4Game中,我有以下内容:

public class P4Game{
  //INSTANCE VARIABLES
  private int nbLines;
  private int nbColumns;
  private P4Board [][] position;  

//CONSTRUCTOR  
  public P4Game(int nbLines, int nbColumns){
    this.nbColumns = nbColumns;
    this.nbLines = nbLines;
    P4Board [][] position = new P4Board [nbLines][nbColumns]; //Creates the table to receive the instances of the P4Board object.*/
    for (int i=0; i<nbLines; i++){
      for (int j=0; j<nbColumns; j++){
        this.position[i][j] = new P4Board(i,j); //Meant to create each object at (line=i, column=j)
      }
    } 
  }

这会在我提到this.position[i][j]的嵌套循环中导致NullPointerException。我在这个类的其他方法中引用这些对象,所以我需要它们作为实例变量。我想这个例外是因为我没有在表的开头列出表元素position[i][j]作为实例变量。

我对这里的人的问题是(1)我的假设是正确的,如果是这样的话(2)声明这种形式的实例变量的语法是什么?

谢谢大家的帮助,我意识到这是一个非常基本的问题。希望它也会使其他新手受益。

干杯,

JDelage

7 个答案:

答案 0 :(得分:3)

请参阅内联添加的评论...您的代码很好,除了一个小细节,您正在创建一个新的position变量,您实际上意味着使用实例变量。

public class P4Game{
    //INSTANCE VARIABLES
    private int nbLines;
    private int nbColumns;
    private P4Board [][] position;  

    //CONSTRUCTOR  
    public P4Jeu(int nbLines, int nbColumns){
        this.nbColumns = nbColumns;
        this.nbLines = nbLines;
        // You're creating a LOCAL variable called position here if you don't comment what's commented:.
        /*P4Board [][] */position = new P4Board [nbLines][nbColumns]; //Creates the table to receive the instances of the P4Board object.*/
        for (int i=0; i<nbLines; i++){
            for (int j=0; j<nbColumns; j++){
                this.position[i][j] = new P4Board(i,j); //Meant to create each object at (line=i, column=j)
            }
        } 
    }
}

答案 1 :(得分:2)

您的假设不正确。

在构造函数中,您将创建一个与该字段同名的局部变量。 (通过编写 P4Board [][] position = ...)这会创建一个局部变量,但不会影响该字段,该字段仍未初始化。您需要删除P4Board [][]以将其从变量声明更改为现有字段的分配。 (就像你写this.nbLines = ...来分配字段一样)

答案 2 :(得分:1)

您正在构造函数中重新定义P4Board [][] position,然后调用未初始化的this.position(即为null)。

答案 3 :(得分:1)

仔细看看!您正在隐藏实例变量&gt; P4Board [][] position = new P4Board [nbLines][nbColumns];

答案 4 :(得分:1)

正如其他人所说,您正在使用局部变量隐藏实例变量。您应该查看checsktyle,因为它有checks to tell you if you have made such a mistake。另外两个工具是PMDFindBugs

答案 5 :(得分:0)

您的假设不正确。尝试在你的作业中查找更高的几行。

答案 6 :(得分:0)

这适合我。我代替了P4Board,因为你没有提供它:

public class P4Game
{
  private int nbLines;
  private int nbColumns;
  private int [][] position;

    public static void main(String[] args)
    {
        P4Game game = new P4Game(3, 3);
        System.out.println(game);
    }

  public P4Game(int nbLines, int nbColumns)
  {
    this.nbColumns = nbColumns;
    this.nbLines = nbLines;
    this.position = new int[this.nbLines][this.nbColumns];
    for (int i=0; i < this.nbLines; i++)
    {
      for (int j=0; j < this.nbColumns; j++)
      {
        this.position[i][j] = i+j;
      }
    }
  }
    public String toString()
    {
        StringBuilder builder = new StringBuilder(1024);

        builder.append('[');
        for (int i = 0; i < this.nbLines; ++i)
        {
            builder.append('{');
            for (int j = 0; j < this.nbColumns; ++j)
            {
                builder.append(this.position[i][j]).append(',');
            }
            builder.append('}');
        }
        builder.append(']');

        return builder.toString();

    }
}