Try / Catch and Loop Control - PullRequest
       0

Try / Catch and Loop Control

0 голосов
/ 30 марта 2011

Я запутался в этом предложении try / catch

public int MakeMove() {
    int x = 0; //counter for moves

    try {
        // tests to see if potential move has been reached
        if (board[currentRow + (vertical[x])][currentColumn + (horizontal[x])] != 0) {
            // increments x until a good move is reached.
            while ((board[currentRow + (vertical[x])][currentColumn + (horizontal[x])] != 0)) {
                x++;
                if (x == 8) { //breaks if all moves are tried
                    return 1;
                }
            } 
        }
    }
    //should catch any tries to move piece off board, catches the exception and increments x
    catch(ArrayIndexOutOfBoundsException e) {
        x++;
        if(x == 8) {//breaks if all moves are tried
            return 1;
        }
    }

Как это должно работать: горизонтальный [] и вертикальный [] - это два типа int [], каждый из которых содержит значение для возможного шахматного рыцаряходы, то есть 2 горизонтальных и 1 вертикальный выходы будут одним ходомТогда ему следует присвоить ненулевое значение movenumber для "квадрата".Бит try / catch должен перехватывать любые движения вне доски, увеличивать x, а затем снова проходить цикл.Но всякий раз, когда он проходит через утверждение, он не проходит через первый, если снова;вместо этого он переходит ко второму, если и генерирует исключение.Я не уверен, какое утверждение вернуло бы контроль таким образом.

Ответы [ 2 ]

4 голосов
/ 30 марта 2011

Вы писали:

Бит try / catch должен перехватывать любые движения вне доски с шагом x, а затем снова проходить цикл.

Нетне должно.Похоже, вы думаете об обработчике исключений («бите перехвата»), как если бы это был метод, который вызывается при возникновении исключения, который вернет управление обратно туда, откуда оно было вызвано.Они работают не так.

Когда в вашем коде возникает ArrayIndexOutOfBoundsException, управление переходит к обработчику исключений.Вся обработка кода в блоке try прекращена - он не будет возобновлен.Код в блоке catch выполняется.Если x==8, ваш метод вернет значение;но в противном случае ваш обработчик исключений просто увеличивает x и завершает работу.Это означает, что выполнение вашего кода начинается после окончания блока catch.Вы не показали остальную часть своего метода - я думаю, что должно быть больше, так как требуется вернуть значение - поэтому я не могу точно сказать, что происходит дальше, но это может привести к ряду проблем.

Обработка исключений здесь просто неуместна.Проверьте ваши координаты по размеру доски явно.

1 голос
/ 30 марта 2011

Переместите пробную защелку внутрь цикла, если вы хотите, чтобы он снова входил в цикл после завершения тела защелки.

Но на самом деле, слушайте всех, кто говорит, что вы не должны использовать исключения для этого.

...