Почему инициализация переменной j не может быть в выражении завершения цикла for? - PullRequest
0 голосов
/ 28 апреля 2018
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 имеет одинаковую длину для строк и столбцов.

1 Ответ

0 голосов
/ 28 апреля 2018

ваша логика здесь отключена, поскольку 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++)
...