这是一个名为placeShips()的方法,我通过另一个方法(由ButtonListener调用)调用。但是当所有这些都被调用时,我在嵌套最深的行上得到一个NullPointerException——System.out.println(ships[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);
}
您有一个类级数组变量: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());
}
}
如果这不起作用,则调试代码以查找实际抛出异常的对象
看起来你的构造函数只是初始化了一个名为ships的局部变量。你说你有:
-----Constructor begins here-----*
Ships[] ships = new Ships[NUM_SHIPS];
*-----Constructor ends here-----*`
但是看起来你真的想要
ships = new Ships[NUM_SHIPS];