在Do-While循环中使用Array[]的问题



这是一个名为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];

最新更新