Java: соответствующее исключение для ошибки инициализации - PullRequest
30 голосов
/ 13 марта 2012

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

Ответы [ 5 ]

38 голосов
/ 13 марта 2012

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

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

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

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

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

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

2 голосов
/ 13 марта 2012

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

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

2 голосов
/ 13 марта 2012

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

2 голосов
/ 13 марта 2012

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

1 голос
/ 13 марта 2012

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

...