Java. Как избежать StackOverflow после создания нескольких объектов?

В настоящее время я работаю над своим экзаменационным проектом для универа. Задача состоит в том, чтобы создать настольную игру Людо. Написав немного кода и проведя некоторое тестирование, я столкнулся с StackOverflowError.

Итак, вот структура (необходимо 5 классов): Main.class GUI.class Game.class Player.class Piece.class

Main создает новый объект типа GUI с именем mainGUI. Это создает визуальные эффекты для игры, включая небольшую область настроек с кнопкой запуска.

При нажатии кнопки «Старт» создается новый объект типа «Игра», который затем создает 4 новых объекта типа «Игрок» (очевидно, 4 игрока).

При создании объекта типа Player этот тип получает аргумент 'nmbr', который просто указывает номер игрока (Player1, Player2 и т. д.).

У каждого игрока есть 4 фигуры для перемещения по доске, поэтому каждый из этих 4 игроков создает еще 4 объекта типа «фигурка».

Теперь при нажатии кнопки «Старт» должно происходить то, что фигуры отображаются на доске. Но этого не происходит. Вместо этого я получаю сообщение об ошибке, в котором говорится, что при вызове первого объекта Player возникает StackOverflowError.

Поэтому я попытался изучить поведение создания объектов в java, StackOverflow и тому подобное. Но единственный вывод, который я могу здесь сделать, это то, что я создал слишком много объектов один внутри другого.

public class Main {
    public static void main(String[] args){
        Main start = new Main();
        start.activate();
    }

    static GUI mainGui;

    public Main() {
       mainGui = new GUI();

    }

Внутри графического интерфейса есть кнопка JButton «отправить». Эта кнопка предназначена для запуска игры путем создания объекта типа Game.

submit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object btn = e.getSource();
                boolean ACTIVE = ((JButton) btn).isEnabled();
                if (ACTIVE) {
                    submit.setVisible(false);
                    cancel.setVisible(true);
                    Game spiel = new Game();
                    spiel.begin();
                }
            }
        });
public class Game {

    public Game() {

    }

    Player player1 = new Player(1);   //this is where the Error occurs
    Player player2 = new Player(2);
    Player player3 = new Player(3);
    Player player4 = new Player(4);
}
etc.
public class Player extends Game {

    private String name;
    private Color color;
    private boolean artiPlayer;
    private int playerNmbr, start, end;
    private int[] startArea, endArea;
    Piece piece1, piece2, piece3, piece4;

    public Player(int nmbr){
        if (nmbr == 1) {    
            System.out.println("1.1");
            piece1 = new Piece(500,175, Color.BLUE, Main.mainGui);
            piece2 = new Piece(550, 175, Color.BLUE, Main.mainGui);
            piece3 = new Piece(500,125, Color.BLUE, Main.mainGui);
            piece4 = new Piece(550, 125, Color.BLUE, Main.mainGui);
            start = 0;
            end = 64;
     }
}

Type Piece => Piece(xPos, yPos, Color, GUI)
//and so on

Вот точное сообщение об ошибке:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at spielPackage.Player.<init>(Player.java:18)
    at spielPackage.Game.<init>(Game.java:9)

Извините, если код немного нечист. Я довольно новичок в java, и это все еще продолжается.

На данный момент я не понимаю, почему Java выдает StackOverflowError


person fl_sh    schedule 05.08.2019    source источник


Ответы (1)


Ваш Player не должен не extend Game, поскольку Player не является Game.

Прямо сейчас вы создаете игру, которая создает четырех игроков, каждый из которых является отдельной «Игрой», и создаете еще четырех игроков, которые являются играми, и создаете четырех новых игроков каждый......

person luk2302    schedule 05.08.2019
comment
Вы опередили меня с более коротким ответом.. Только что написал один. ;) Вместо этого проголосуйте. - person Kevin Cruijssen; 05.08.2019
comment
Спасибо. Это исправило это. Не думал, что это будет проблемой. Теперь я чувствую себя немного глупо, что на самом деле это было так просто, и я не мог сделать это сам... Но большое спасибо - person fl_sh; 05.08.2019
comment
короткое и четкое объяснение - person Bhanu Boppana; 05.08.2019