#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. Это также помогло, оказывается, мне не нужны были корабли [] в начале. Он больше не выдает ошибку! Спасибо всем.