StackOverflowError - Jaja - PullRequest
       16

StackOverflowError - Jaja

0 голосов
/ 28 ноября 2018

Я пытаюсь сделать простой код на Java: у меня есть класс с именем «Bloc», который создает блоки (квадрат), внутри которого я создаю случайную ширину (largeur) и случайную высоту (hauteur)между 2 дюймами, и я создаю случайное количество блоков (nombreBloc).Я также создаю ArrayList, чтобы поместить в него каждый блок, чтобы посмотреть, сколько у меня осталось.

Итак, я сделал функцию «insererBlocList» (вставка блока в ArrayList), которая создает «nombreBloc» (числоBloc) блоков и помещает его в ArrayList.

У меня есть графический интерфейс, в котором у меня есть 1 панель для окон, внутри которой у меня есть 2 другие панели: одна из них - поместить в нее каждый созданный мной блок.

Вот моя проблема, у меня есть «StackOverflowError» внутри моей функции «insererBlocList», что означает бесконечный цикл, но после записи пути кода я не вижу, где я допустил ошибку ..Вот код:

Класс блока:

public class Bloc extends JPanel{
    private int hauteur, largeur, nombreBloc;
    private boolean premierPassage = true;
    private ArrayList<Bloc> listeBlocRestant;
    private Random rand = new Random();

public Bloc() {
    this.hauteur = 10 + rand.nextInt(50 - 10);
    this.largeur = 10 + rand.nextInt(50 - 10);      
    listeBlocRestant = new ArrayList<Bloc>();
    if(premierPassage == true) {
        this.nombreBloc = 5 + rand.nextInt(30 - 5);
        insererBlocList();
    }
}

public ArrayList<Bloc> insererBlocList(){
    premierPassage = false;
    for(int i=0; i<nombreBloc; i++) {       
        Bloc bloc = new Bloc();
        listeBlocRestant.add(bloc);
    }
    return listeBlocRestant;
}

Часть графического интерфейса блока панели:

    private JPanel initPanelBloc() {
     panelBloc = new Bloc();
   }

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы можете подумать, что premierPassage = false;предотвратит повторный вызов метода.Но insererBlocList () создает новый экземпляр Bloc, и это логическое значение снова будет истинным.Измените код следующим образом:

public class Bloc extends JPanel{
    private int hauteur, largeur, nombreBloc;
    private ArrayList<Bloc> listeBlocRestant;
    private Random rand = new Random();

public Bloc(boolean premierPassage) {
    this.hauteur = 10 + rand.nextInt(50 - 10);
    this.largeur = 10 + rand.nextInt(50 - 10);      
    listeBlocRestant = new ArrayList<Bloc>();
    if(premierPassage == true) {
        this.nombreBloc = 5 + rand.nextInt(30 - 5);
        insererBlocList();
    }
}

public ArrayList<Bloc> insererBlocList(){
    premierPassage = false;
    for(int i=0; i<nombreBloc; i++) {       
        Bloc bloc = new Bloc(false);
        listeBlocRestant.add(bloc);
    }
    return listeBlocRestant;
}

И измените часть графического интерфейса следующим образом:

private JPanel initPanelBloc() {
     panelBloc = new Bloc(true);
}
0 голосов
/ 28 ноября 2018

Ваш Bloc конструктор вызывает insererBlocList(), а insererBlocList() создает дополнительные Bloc экземпляры (для каждого из них конструктор вызывает insererBlocList()), что приводит к бесконечной цепочке вызовов методов, что приводит к StackOverflowError.

insererBlocList(), вероятно, не должен вызываться конструктором Bloc.

...