Столкновение с 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();
Затем он повторяет цикл снова и продолжает выделять все больше и больше памяти, вызывая переполнение стека, даже не завершая полностью создание одного экземпляра.