Столкновение с java.lang.StackruError при генерации непроверенного исключения из конструктора

Я пытался запустить приведенный ниже пример кода, но получил ошибку Stackru. Кажется, застрял в бесконечном цикле. Кто-нибудь может мне помочь, зная, что здесь происходит?

Пожалуйста, найдите ниже фрагмент кода

public class ConstructorExample {

    private ConstructorExample c1 = new ConstructorExample();

    public ConstructorExample(){
        throw new RuntimeException();
    }

    public static void main(String[] str){
        ConstructorExample c = new ConstructorExample();
    }
}

2 ответа

Решение

У вас есть личный член ConstructorExample c1 = new ConstructorExample(); в классе ConstructorExample.

Когда вы создаете экземпляр первого экземпляра ConstructorExample, JVM выделяет память для этого ConstructorExample, а затем пытается создать экземпляр первого члена c1. Это создание начинается с выделения памяти для другого экземпляра ConstructorExample и т. Д.

Кроме того, исключение времени выполнения не имеет значения, потому что инициализатор члена выполняется перед конструктором.

Это как и ожидалось. Создание экземпляра ConstructorExample выполняется из основного метода, для которого переменная экземпляра инициализируется перед вызовом конструктора.

private ConstructorExample c1 = new ConstructorExample();

Затем он повторяет цикл снова и продолжает выделять все больше и больше памяти, вызывая переполнение стека, даже не завершая полностью создание одного экземпляра.

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