Можно ли конструкторам генерировать исключения во время выполнения? - PullRequest
18 голосов
/ 03 февраля 2010

Когда проверенные исключения вызываются из методов в конструкторе, которые конструктор не может обработать, можно ли их перехватить и выбросить обратно как исключение времени выполнения, если вы уверены, что приложение не может обработать его и будет бесполезным без строящийся объект?

Ответы [ 6 ]

11 голосов
/ 03 февраля 2010

Да. Это стандартная практика.

В Effective Java, 2nd Ed. это охватывается пунктом 61 «Бросать исключения, соответствующие абстракции». Независимо от того, проверено ли исключение или проверено на нем, в статье 58 «Эффективное Java» также описывается «Использовать проверенные исключения для восстанавливаемых условий и исключения времени выполнения для ошибок программирования».

То, что это конструктор, а не обычный метод, на самом деле не проблема. (На самом деле, конструкторы, возможно, имеют больше свободы, поскольку они не связаны интерфейсом супер.)

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

11 голосов
/ 03 февраля 2010

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

4 голосов
/ 03 февраля 2010

Да, вполне допустимо выдавать исключение в вашем конструкторе.У вас мало или нет другого выбора, кроме как сделать это, особенно когда вы просто пытаетесь построить объект, а вещи просто не работают правильно .

2 голосов
/ 03 февраля 2010

Совершенно нормально выдать исключение check , чтобы указать, что построение объекта не удалось, как уже заметил Крис Джестер-Янг. Является ли хорошей идеей выбрасывать исключение unchecked - это другая проблема. Вы бы потеряли придирчивость компилятора, который побуждает вас перехватывать и обрабатывать исключение, что вы наверняка захотите сделать.

1 голос
/ 05 февраля 2010

Лично мне не нравится, когда конструкторы выдают проверенные исключения (как уже указывал doppeldish). Тем не менее, как вы можете быть уверены, что приложение не может обработать исключение? Даже если приложение не может справиться с этим, может, пользователь может просто повторить попытку?

1 голос
/ 03 февраля 2010

Да.Если вы не знаете, как следует обрабатывать исключение, вам лучше его выбросить, чем просто проглотить и распечатать трассировку стека (или, что еще хуже, абсолютно ничего не делать).

Это поможет предотвратить некоторые чрезвычайно трудные для отладки ошибки в дальнейшем.

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