Java: соответствующее исключение для ошибки инициализации

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

Ответ 1

Если вы выбрасываете исключение на фабрике из-за недостаточных данных, мне нравится бросать IllegalStateException с описанием, аналогичным "невозможно построить X, а Y не установлен".

Если вы бросаете исключение на фабрику из-за противоречивых данных, мне нравится бросать IllegalStateException с описанием, аналогичным "не может конструировать X, Y конфликты с Z".

Если вы выбрасываете исключение на фабрике из-за плохого (или бессмысленного) значения, мне нравится бросать исключение IllegalArgumentException с описанием, аналогичным "Y не может быть A".

Если вы бросаете исключение в Factory из-за отсутствующего значения, мне нравится бросать исключение IllegalArgumentException с описанием, аналогичным "Y не может быть null".

Последнее предпочтение зависит от некоторых дебатов. Некоторые люди предполагают, что лучше было бы выбрасывать NullPointerException; в моем случае мы избегаем их любой ценой, поскольку многие клиенты, как правило, не читают сообщение об исключении (и предполагают, что NullPointerException означает ошибку кодирования).

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

Ответ 2

Вы можете создать свое собственное исключение, расширив класс Exception

Ответ 3

Что-то вроде этого, вероятно, должно быть просто Assert, но если на самом деле есть вероятность того, что это произойдет, тогда выбор, который имеет для вас значение, будет моим выбором.

Ответ 4

Да, причина проблемы - ваш лучший выбор. Если аргументы не в порядке, вы можете выбросить IllegalArgumentException, если какой-то файл не существует, вы можете бросить FileNotFoundException, если завод не инициализирован правильно, вы можете выбросить IllegalStateException и т.д. И т.д.

Однако создать собственное исключение легко. Просто объявите класс как extends Exception и добавьте конструкторы делегата. Если вы расширяете исключение, то этот метод, который может его выбросить, должен быть объявлен с помощью throws. Если вы этого не хотите, вы можете расширить RuntimeException, они не должны быть объявлены.

Ответ 5

В идеале вы хотели бы расширить Exception и создать собственное IntializatonException.