Когда экземпляр класса создается сам по себе, то почему операторы в конструкторе не выполняются? - PullRequest
1 голос
/ 03 апреля 2019

Когда создается экземпляр класса, вызывается его конструктор.В этом примере я хочу проверить, когда произошла ошибка 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 Ответ

1 голос
/ 03 апреля 2019

Инициализация члена происходит перед телом конструктора. Поэтому, когда вы создаете экземпляр 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...