为啥变量 j 初始化不能在 for 循环的终止表达式中?
Posted
技术标签:
【中文标题】为啥变量 j 初始化不能在 for 循环的终止表达式中?【英文标题】:Why can't variable j initialization be in the termination expression of the for loop?为什么变量 j 初始化不能在 for 循环的终止表达式中? 【发布时间】:2018-10-09 07:36:02 【问题描述】: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] = '-';
我知道使用的列长度不是行长度,而是二维数组在行和列方面具有相同的长度。
【问题讨论】:
您可以尝试使用for (int j = 0; j < board[i].length; j++)
@Paul 抱歉,我的原始答案有点欠缺。刚刚在下面添加了更多细节,现在应该可以回答您的问题了。
@Paul 在您的新编辑中,以下行没有意义 char[][] board = new char[board.length][board.width];
。首先,数组没有名为 width 的属性,因此 board.width
甚至无法编译。第二个板阵列尚未定义,因此当长度尚未设置时,您不能调用“board.length”。
【参考方案1】:
你的逻辑在这里不成立,因为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
Well 8 超出了 board 数组的范围,因此它会引发异常,它根本无法评估它。变量 i
但是永远不会达到 8,它会在 7 处停止,因此在这种情况下您永远不会得到超出范围的索引。
如果您执行以下操作,它会起作用(但不好的做法):
for(int j = 0; j < board[0].length; j++)
【讨论】:
我知道我计算的是 x 维度而不是 y。但是,board[i].length 与 board[j].length 不一样吗?那么是否应该产生相同的答案? @Paul 我更新了我的答案。它现在回答你的问题了吗?以上是关于为啥变量 j 初始化不能在 for 循环的终止表达式中?的主要内容,如果未能解决你的问题,请参考以下文章