Проблема с использованием массива [] в цикле Do-While

#java

#java

Вопрос:

Вот метод, называемый placeShips(), который я вызываю с помощью другого метода (который вызывается ButtonListener). Но когда вызываются все, я получаю исключение NullPointerException в самой глубокой вложенной строке — System.out.println(отправляет[i]);. Массив был объявлен и инициализирован над этим кодом в конструкторе. Он установлен равным постоянному целому числу, равному 3. Я поместил простую строку в эту распечатку, и она работает. Но всякий раз, когда задействован массив, он становится беспорядочным. Что происходит не так?

NUM_SHIPS, NC_EMPTY, NC_SHIP и все метки / кнопки также были созданы.

 private Ships ships[];

*-----Constructor begins here-----*
Ships[] ships = new Ships[NUM_SHIPS];
*-----Constructor ends here-----*

ships[0] = new Ships("Aircraft Carrier", 5, false);
ships[1] = new Ships("Battleship", 4, false);
ships[2] = new Ships("Cruiser", 3, false);

public void placeShips()
{
    statusLabel.setText("Press [Play]");
    int shipsPlaced = 0;

    do
    {
        int randomRow = (int)(Math.random()*ROWS);
        int randomCol = (int)(Math.random()*COLS);

        if (gameBoard[randomRow][randomCol] == NC_EMPTY)
        {
            gameBoard[randomRow][randomCol] = NC_SHIP;
            shipsPlaced = shipsPlaced   1;

            for (int i = 0; i < NUM_SHIPS; i  )
            {
                System.out.println(ships[i]);
            }
        }
    }while (shipsPlaced < NUM_SHIPS);
}
  

Комментарии:

1. Равно ли NUM_SHIPS кораблям. длина?

2. являются ли placeShips() и ships[] array членами одного и того же класса? Вы пробовали поставить точку останова в операторе println и посмотреть , есть ли в массиве ships объекты ship или массив пуст?

3. Есть ли у вас переменная массива уровня класса под названием «ships»? Вы уверены, что назначаете ему, прежде чем пытаться использовать его в PlaceShips()? Кроме того, лучше построить свой цикл for следующим образом for (int i = 0; i < ships.Length; i ){...}

4. NUM_SHIPS равно ships. длина.

5. Что касается класса, у меня есть отдельный Ships.java файл, содержащий класс и конструктор для кораблей.

Ответ №1:

У вас есть переменная массива уровня класса : private Ships ships[]; , но вы определяете ее в своем конструкторе Ships[] ships = new Ships[NUM_SHIPS]; . Вы когда-нибудь присваивали переменной уровня класса? вы могли бы попробовать

 /* Class Level */
private Ships _ships[];

/* In constructor */
_ships = new Ships[NUM_SHIPS];

/* In PlaceShips() */
for (int i = 0; i < _ships.Length; i  )
{
    if(_ships[i] != null)
    {
        System.out.println(_ships[i].toString());
    }
}
  

Если это не сработает, отладьте код, чтобы определить, какой объект на самом деле генерирует исключение

Ответ №2:

Похоже, что ваш конструктор только инициализирует локальную переменную с именем ships. Вы говорите, что у вас есть:

 -----Constructor begins here-----*
Ships[] ships = new Ships[NUM_SHIPS];
*-----Constructor ends here-----*`
  

Но, похоже, вы действительно хотите

ships = new Ships[NUM_SHIPS];

Комментарии:

1. Это также помогло, оказывается, мне не нужны были корабли [] в начале. Он больше не выдает ошибку! Спасибо всем.