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

Возьмем этот метод

/**
 * @return List of group IDs the person belongs to
 *
 */
public List<String> getGroups() {
    if (this.getId().equals("")) return null;
}

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

Ответ 1

Я бы использовал IllegalArgumentException, если параметр/аргумент управляется извне или IllegalStateException, если метод вызван только в неправильный момент (состояние). В вашем конкретном случае я думаю, что это последнее. Альтернативой (сомнительной) является NullPointerException.

Однако это должно быть явно задокументировано в @throws, чтобы пользователь понял причину.

Ответ 3

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

Ответ 4

Я бы использовал исключение IllegalStateException, потому что id - это состояние владельца. Если идентификатор прошел бы как параметр, исключение IllegalArgumentException было бы правильным.

Ответ 5

Вместо того, чтобы бросать исключение, вы должны просто вернуть пустой список. Если параметр зависимости/не выполняется, то результатов нет. Из комментариев и кода, опубликованных, похоже, что это ожидаемое поведение. Если идентификатор пуст, то нет присоединенных групп, таким образом, пустой список.

Ответ 6

Я бы создал свой собственный тип исключения, расширив Exception. Таким образом, вызывающие функции могут поймать это конкретное Исключение и обработать его изящно, если это необходимо. Обратите внимание: вы можете сделать то же самое, что и все, что расширяет исключение, но я предпочитаю создавать свои собственные классы исключений, чтобы я мог быть очень уверенным в обработке исключений. Это, конечно, зависит от вас.