Что вызывает эту ошибку переполнения стека, когда нет бесконечного рекурсивного метода? - PullRequest
0 голосов
/ 19 января 2020

Я делаю шахматную программу на Java. У меня есть логический метод, который берет местоположение, в которое пользователь хотел бы переместить ладью, в форме двух int s, и основываясь на текущей строке и столбце ладьи, определяет, может ли ладья переместиться туда, используя для петли. Вот один из циклов в качестве примера.

int nc = col - 1;
    while (nc >= 0){
    moves.add(new Integer[]{row, nc});
    if (locals[row][nc] != null)
        break;
    nc--;
}

moves - это ArrayList, который я объявил ранее в программе. В нем хранится список всех допустимых ходов, и это один из циклов for, которые я использую для его создания.

Проблема заключается в том, что при каждом запуске этого кода строки, содержащие методы add, подсвечиваются. для того, чтобы быть бесконечными циклами, и код не будет работать. Что я делаю не так?

Редактировать :

Это точное сообщение об ошибке, которое программа показывает мне:

enter image description here

enter image description here

Кроме того, я собираюсь опубликовать полный текст метода. Я не уверен, относится ли это к моему вопросу, но может оказаться полезным.

public boolean isValidMove(int r, int c){
        Piece[][] locals = Chess.getBoard();
        if (r < 0 || c < 0 || r > 7 || c > 7 || (locals[r][c] != null && locals[r][c].getWhite() == isWhite))
            return false;
        ArrayList<Integer[]> moves = new ArrayList<Integer[]>();
        int nc = col - 1;
        while (nc >= 0){
            moves.add(new Integer[]{row, nc});
            if (locals[row][nc] != null)
                break;
            nc--;
        }
        nc = col + 1;
        while (nc < 8){
            moves.add(new Integer[]{row, nc});
            if (locals[row][nc] != null)
                break;
            nc++;
        }
        int nr = row - 1;
        while (nr >= 0){
            moves.add(new Integer[]{nr, col});
            if (locals[nr][col] != null)
                break;
            nr--;
        }
        nr = row + 1;
        while (nr < 8){
            moves.add(new Integer[]{nr, col});
            if (locals[nr][col] != null)
                break;
            nr++;
        }
        for (Integer[] ints : moves){
            if (ints[0] == r && ints[1] == c)
                return true;
        }
        return false;
    }

1 Ответ

1 голос
/ 24 января 2020

Я обнаружил, что не так с программой, и сумел ее исправить. Вопрос l oop на самом деле не повторяется вечно, однако метод где-то в этой программе вызвал другой метод, который в свою очередь вызвал оригинальный метод. Следовательно, ошибка переполнения стека без какого-либо одного бесконечно рекурсивного метода.

...