#java #constructor #stack-overflow
#java #конструктор #stack-overflow
Вопрос:
При создании экземпляра класса вызывается его конструктор. В этом примере я хочу проверить, когда произошла ошибка StackOverflow. Но инструкции, объявленные внутри конструктора, не выполняются, почему? смотрите следующий код
public class StackOverFlowSampleMain {
StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();
static int x = 0;
StackOverFlowSampleMain() {
x ; //aren't these lines supposed to be executed?
System.out.println(x);
}
public static void main(String[] args) {
StackOverFlowSampleMain oomeSampleMain = new StackOverFlowSampleMain();
}
}
Комментарии:
1. Не могли бы вы добавить немного исходного кода, пожалуйста?
2. Добавлен код, извините за неполный пост. Я новичок в размещении вопросов и, следовательно, обучаюсь
3. Конструктор выполняется сразу после
oomeSampleMain
инициализации — чего никогда не происходит.4. Я понятия не имею, что здесь происходит. Это безумный поступок. Я бы не подумал, что это будет компилироваться. Это не может принести ничего хорошего. Когда вы создаете экземпляр ** StackOverFlowSampleMain** , он создаст свой член oomeSampleMain . Но это StackOverFlowSampleMain . Таким образом, это приведет к созданию его элемента oomeSampleMain . Но это объект StackOverFlowSampleMain . Таким образом, это приведет к созданию его элемента oomeSampleMain . И так далее, и так далее. Как вы думаете, что должен делать этот код?
5. Эта штука взрывается! Я просто запустил его, и он делает то, что я expected…it происходит сбой стека. — здесь происходит бесконечная рекурсия. Он никогда не выполняет код конструктора, потому что он никогда не заходит так далеко.
Ответ №1:
Инициализация элемента происходит перед телом конструктора. Итак, когда вы создаете StackOverFlowSampleMain
экземпляр, первое, что он делает, это инициализирует его oomeSampleMain
член. Он, в свою очередь, пытается инициализировать свой собственный oomeSampleMain
член и так далее, пока программа не завершится сбоем с StackOverflowError
, поэтому увеличение x
просто никогда не достигается.
Если вы хотите измерить, когда StackOverflowError
происходит, вы могли бы переместить код, который вызывает это, в конец конструктора:
public class StackOverFlowSampleMain {
StackOverFlowSampleMain oomeSampleMain;
static int x = 0;
StackOverFlowSampleMain() {
x ;
System.out.println(x);
oomeSampleMain = new StackOverFlowSampleMain(); // Here, after x is printed
}
}
Комментарии:
1. Ну и дела… жаль, что я не подумал об этом! (tic) . [На самом деле это не имеет значения, но это отличный случай для того, чтобы щелкнуть по этому окошку «Сообщество Wiki», IMO ]