Исключения в конструкторах - PullRequest
7 голосов
/ 14 апреля 2010

В C ++ время жизни объекта начинается после успешного завершения конструктора. Внутри конструктора объект еще не существует.

В: Что означает создание исключения из конструктора?

A: Это означает, что строительство не удалось, объект никогда не существовал, его срок жизни не начался. [ источник ]

Мой вопрос: верно ли то же самое для Java? Что произойдет, например, если я передам this другому объекту, а мой конструктор потерпит неудачу?

Foo()
{
    Bar.remember(this);
    throw new IllegalStateException();
}

Это хорошо определено? Bar теперь имеет ссылку на не-объект?

Ответы [ 3 ]

8 голосов
/ 14 апреля 2010

Объект существует, но он не был правильно инициализирован.

Это может происходить всякий раз, когда this протекает во время строительства (не только когда вы бросаете исключение).

Это очень проблематичная ситуация, потому что некоторые общепринятые гарантии не выполняются в этой ситуации (например, final поля могут изменить свое значение во время построения).

Следовательно, вам определенно следует избегать утечки this в конструкторе.

Эта статья IBM developerWorks описывает меры предосторожности, которые необходимо соблюдать при построении объектов, и обоснование этих мер предосторожности. Хотя в статье обсуждается этот вопрос в свете многопоточности, в однопоточной среде могут возникать похожие проблемы, когда неизвестный / ненадежный код получает ссылку на this во время построения.

1 голос
/ 14 апреля 2010

Вы никогда не должны открывать ресурсы, такие как средство записи файлов, в своем конструкторе. Вместо этого создайте метод init и сделайте это оттуда. Тогда ты в безопасности.

0 голосов
/ 14 апреля 2010

Этот код не является безопасным для исключений, и ни один не будет безопасным для исключений в C ++. Это та же ошибка, независимо от того, какой язык вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...