为什么变量 j 初始化不能在 for 循环的终止表达式中?


public class Gameboard
{      
    public char[][] board;
    public static void main(String args[])
    {
        Gameboard blank = new Gameboard(false);
        System.out.println("Printing blank gameboard:n" + blank + "n");
    }
    public Gameboard(boolean setup)
    {
        char[][] board = new char[8][8];
        if (!setup)
        {
            for(int i = 0; i < board.length;i++)
            {
                for(int j = 0; j < board[j].length;j++)//critical condition
                {
                    board[i][j] = '-';
                }
            }
        }
    }
}

我知道列长的长度不是行长,而是2D阵列的长度和列的长度相同。

您的逻辑不在这里,因为i通过第一个维度计数,而j通过第二个维度计算:您真正想要的是

for(int i = 0; i < board.length; i++)
{
    for(int j = 0; j < board[i].length; j++)
    {
        board[i][j] = '-';
    }
}

这个问题当然是以下行:

for (int j = 0; j < board[j].length; j++)

您将j用作板数组第一维的索引,但将其定义为一个值,最大长度等于第二维度的长度。当然,哪个使您有机会将索引超出范围,这正是该代码所产生的。

您有问题的原因是两个维度都一样,是因为for循环退出的条件会重新评估每个循环。

逻辑是:

j < board[j].length

所以在7点您得到:

7 < board[7].length

与:

相同
7 < 8

很棒的经过,所以经过另一个循环,但是在8时发生了什么?

8 < board[8].length

井8不在板阵列的范围内,因此它引发了例外,它根本无法对其进行评估。但是,变量i永远不会达到8,它停止在7,因此在这种情况下您永远不会从范围中获得索引。

如果您做了以下操作(但不良练习(:

for(int j = 0; j < board[0].length; j++)

最新更新