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

时间:2018-04-28 18:12:24

标签: java for-loop multidimensional-array conditional-statements

$name = $_FILES['file']['name'];
$target_dir = "upload/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);

// Select file type
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Valid file extensions
$extensions_arr = array("jpg","jpeg","png","gif");

// Check extension
if( in_array($imageFileType,$extensions_arr) ){

// Insert record
$query = "insert into images(name) values('".$name."')";
mysqli_query($con,$query);

// Upload file
move_uploaded_file($_FILES['file']['tmp_name'],$target_dir.$name);

我知道列长度的使用不是行长度,而是2d数组的行长度和列数相同。

1 个答案:

答案 0 :(得分: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

8号板超出了板阵列的范围,所以它抛出异常,它根本无法评估它。变量i但是永远不会达到8,它会在7处停止,因此在这种情况下你永远不会得到超出范围的索引。

如果您执行了以下操作,它将起作用(但不好的做法):

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