Как объявить элементы таблицы [i] [j] в качестве переменных экземпляра? - PullRequest
2 голосов
/ 28 марта 2010

All

Я пытаюсь закодировать игру Connect4. Для этого я создал класс P4Game и класс P4Board, которые представляют размеры i X j платы Connect4.

В 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)
      }
    } 
  }

Это вызывает исключение NullPointerException во вложенных циклах, где я упоминаю this.position[i][j]. Я ссылаюсь на эти объекты в других методах этого класса, поэтому мне нужно, чтобы они были переменными экземпляра. Полагаю, исключение связано с тем, что я не указал элемент таблицы position[i][j] в качестве переменной экземпляра в начале класса.

Мой вопрос к людям здесь: (1) верно ли мое предположение, и если да (2), каков будет синтаксис для объявления переменных экземпляра этой формы?

Спасибо всем за помощь в том, что, как я понимаю, это очень простой вопрос. Надеюсь, это пойдет на пользу и другим новичкам.

Приветствия

JDelage

Ответы [ 7 ]

3 голосов
/ 28 марта 2010

См. Добавленный комментарий, встроенный ... С вашим кодом все в порядке, за исключением одной маленькой детали, где вы создаете новую переменную 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)
            }
        } 
    }
}
2 голосов
/ 28 марта 2010

Ваше предположение неверно.

В конструкторе вы создаете локальную переменную с тем же именем, что и у поля. (При записи P4Board [][] position = ...) Это создает локальную переменную и не влияет на поле, которое остается неинициализированным. Вам нужно удалить P4Board [][], чтобы изменить его из переменной объявление на присвоение существующего поля. (Точно так же, как вы пишете this.nbLines = ..., чтобы назначить поле)

1 голос
/ 28 марта 2010

Как уже говорили другие, вы скрываете переменную экземпляра с локальной переменной. Вы действительно должны проверить checsktyle , поскольку он имеет проверки, чтобы сказать вам, если вы сделали такую ​​ошибку . Два других инструмента: PMD и FindBugs .

1 голос
/ 28 марта 2010

Смотри внимательно! Вы скрываете переменную экземпляра> P4Board [][] position = new P4Board [nbLines][nbColumns];

1 голос
/ 28 марта 2010

Вы переопределяете P4Board [][] position в конструкторе, а затем вызываете this.position, который не инициализирован (то есть равен нулю).

0 голосов
/ 28 марта 2010

Это работает для меня. Я заменил на 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();

    }
}
0 голосов
/ 28 марта 2010

Ваше предположение неверно.Попробуйте поискать на несколько строк выше информацию об ошибке в домашней работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...