Почему я получаю бесконечный цикл (ошибка Stackru) при создании объекта в классе с помощью конструктора?

Это мой код:

public class ConstructorsDemo{

    public static void main(String a[]){

        Cons1 c1 = new Cons1();

    }

}

class Cons1{

    Cons1 c = new Cons1();// the error is in this line

    Cons1(){

        //does somwthing

    }
}

Таким образом, я получаю ошибку бесконечного цикла здесь (Stackru). Однако хорошо, если я закомментирую любой из двух созданных мной объектов.

Как объект c в моем коде вызывает ошибку Stackru?

4 ответа

Решение

Первый момент: это бесконечная рекурсия, а не бесконечный цикл. Там большая разница. Есть совершенно законные причины использовать бесконечные циклы, и они, как правило, не будут вызывать исключения переполнения стека. Однако для бесконечной рекурсии не существует законных вариантов использования, и ее использование неизменно приведет к исключению переполнения стека. (Я полагаю, вы могли бы поспорить за бесконечную рекурсию хвоста в нескольких странных ситуациях для языков, у которых это есть, но все же...) Если вы получаете исключение переполнения стека, это почти наверняка бесконечная рекурсия, а не бесконечный цикл.

Основная проблема здесь, как уже отмечали другие, состоит в том, что каждый раз, когда вы называете "новым", он, в свою очередь, создает новый объект, который, в свою очередь, создает новый объект, и так далее, и так далее.

Cons1 c = new Cons1();

Давайте посмотрим на ваш класс.

Он имеет (пустой) конструктор и поле того же типа, что и класс.

И это поле инициализируется непосредственно на месте.

Дело в том, что в Java существует четко определенный процесс, который определяет, как / когда вызываться конструкторы и как инициализируются поля класса. И хорошо, поля-члены инициализируются как часть вызовов "new".

Приводит к: когда в вашем главном классе вызывается "new", новый объект Cons1 должен быть создан и инициализирован. Этот объект Cons1 имеет это поле Cons1. Что требует инициализации нового объекта Cons1 с помощью... и так далее.

И именно так вы создали свою первую нескончаемую рекурсию в Java.

Cons1 c = new Cons1();// 

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

Вы создаете объект рекурсивно, каждый раз, когда вы создаете объект, вот почему вы получаете бесконечный цикл, и ведь вызывает переполнение стека

Другие вопросы по тегам