Почему я получаю бесконечный цикл (ошибка 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();//
Пожалуйста, удалите это утверждение и инициализируйте его везде, где вы собираетесь его использовать. Код рекурсивный.
Вы создаете объект рекурсивно, каждый раз, когда вы создаете объект, вот почему вы получаете бесконечный цикл, и ведь вызывает переполнение стека