Какое исключение бросить? - PullRequest
       1

Какое исключение бросить?

17 голосов
/ 28 сентября 2010

У меня есть функция, которая вычисляет среднее значение списка, переданного в качестве аргумента.Я хотел бы знать, какое исключение Java следует выдать, когда я пытаюсь вычислить среднее значение списка размером 0.

public double mean (MyLinkedList<? extends Number> list)
{
    if (list.isEmpty())
        throw new ????????; //If I am not mistaken Java has some defined exception for this case

    //code goes here
}

Спасибо.

Ответы [ 8 ]

26 голосов
/ 28 сентября 2010

Вы можете бросить new IllegalArgumentException().

Брошенный, чтобы указать, что методу был передан недопустимый или неподходящий аргумент.

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

Например, «Невозможно использовать среднее значение в пустом списке».

8 голосов
/ 28 сентября 2010

Сначала задайте себе вопрос: следует ли вообще бросать, а затем, если да, должно ли это быть проверенное или непроверенное исключение.

К сожалению, отрасли нетрекомендации по решению этих вопросов, как показано в ответе StackOverflow:

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

Тем не менее, есть несколько ключевых соображений:

  • Ваш дизайн / видение того, как этот метод должен работать (Разумно ли / нормально ли вызывать метод с 0-размеромсписок)?

  • Соответствие другим методам в классе / упаковке

  • Соответствие применимому стандарту кодирования (если есть)

Мое мнение:

  • Возврат Double.NAN или 0 Если вызов метода со списком размером 0 является обоснованным / ожидаемым /нормально, я бы подумал вернуть Double.NAN или 0, если 0 iПодходит для вашей проблемной области.

  • Бросьте IllegalArgumentException Если мой дизайн говорит, что проверка пустого Списка является строго ответственностью вызывающего абонента и документациипоскольку метод будет четко указывать, что ответственность лежит на вызывающем абоненте, тогда я бы использовал стандартный непроверенный IllegalArgumentException.

  • Бросок специально проверенного исключения Если метод является частью пакета статистики или библиотеки, где несколько функций статистики должны иметь дело с возможным пустым набором данных, я думаю, что это исключительное условие, которое является частью проблемной области.Я бы создал пользовательское (возможно, проверенное) исключение (например, EmptyDataSetException), чтобы быть частью класса / пакета / библиотеки и использовать его во всех применимых методах.Создание проверенных исключений помогает напомнить клиенту о том, как обработать условие.

3 голосов
/ 28 сентября 2010

Вы должны создать новый класс, который расширяет Exception и предоставляет подробности, относящиеся к вашей ошибке.Например, вы можете создать класс с именем EmptyListException, который содержит подробную информацию о вашей ошибке.Этот может быть очень простым классом исключений, который не принимает аргументов конструктора, но, возможно, вызывает super("Cannot generate mean for an empty list"); для предоставления настраиваемого сообщения для трассировки стека.

Часто это не делаетсядостаточно ... один из моих самых ненавистных запахов кода - это когда разработчики используют общее исключение (даже иногда само исключение) и передают строковое сообщение в конструктор.Это допустимо, но значительно усложняет работу тех, кто реализует ваш код, поскольку им приходится ловить общее исключение, когда на самом деле может произойти только несколько вещей.Исключения должны иметь ту же иерархию, что и объекты, которые вы используете для данных на каждом уровне, предоставляя более конкретные детали.Чем более подробно описан класс исключений, тем более детальным и полезным является трассировка стека.

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

2 голосов
/ 28 сентября 2010

Как насчет NoSuchElementException. Хотя IllegalArgumentException может быть лучше.

2 голосов
/ 28 сентября 2010

IllegalArgumentException

1 голос
/ 28 сентября 2010

Я не уверен, что вам вообще следует создавать исключение; среднее «ничего» - это «ничто» или 0, если хотите. Если набор пуст, вы должны просто вернуть 0.

Если вы действительно ДОЛЖНЫ выдать исключение, то IllegalStateException или IllegalArgumentException - ваш лучший выбор.

1 голос
/ 28 сентября 2010

Вы в настоящее время выбрасываете какие-либо другие исключения (или планируете?) Любое из ранее упомянутых исключений подойдет или просто создаете свое собственное.Самая важная вещь - это распространение сообщения о том, что пошло не так.

Если есть вероятность, что «ловец» исключения может повторно его выбросить, чем вы можете исследовать любые другие исключения, которые мог бы «ловить»и брось.

1 голос
/ 28 сентября 2010

Как насчет ArithmeticException - так же, как и броски времени выполнения.

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