Должен ли я добавить броски IllegalArgumentException в функцию? - PullRequest
15 голосов
/ 14 марта 2011

Я создаю научное программное обеспечение с большим количеством вычислений и, конечно, аргументы могут иметь неправильную длину и т. Д. Итак, я использовал класс IllegalArgumentException, как мне показалось правильным названием проблемы, но я должен поставить throws IllegalArgumentExceptionв определении функции?

Я спрашиваю об этом, потому что после того, как я написал это, Редактор Eclipse не попросил меня окружить функцию try и catch.Я думал, что это как попытка поймать были навязаны.Я прочитал учебник по обработке исключений на Java.com, но не уверен, что правильно понял часть, касающуюся моего вопроса.

Ответы [ 5 ]

18 голосов
/ 15 марта 2011

RuntimeException s как IllegalArgumentException используются для указания ошибок программирования . Сама программа должна редко справляться с этим. Кто-то должен вручную исправить код.

Потенциал RuntimeException s должен быть задокументирован каким-либо образом в контракте функций (т.е. в javadoc), либо с явным @throws, либо при описании входных данных. Если у вас нет javadoc для этой функции, вы можете добавить предложение throws, чтобы просто документировать потенциальные ловушки при использовании функции, но в целом добавление предложений throws для исключений времени выполнения не рекомендуется.

Если указание неправильной длины на самом деле не является ошибкой программирования, а является исключительной ситуацией, я бы создал новое проверенное исключение (например, BadLengthError). Если это не исключительная ситуация, не используйте исключения для управления потоком.

4 голосов
/ 14 марта 2011

Существует два типа исключений:

исключения времени выполнения (например, IllegalArgumentException и NullPointerException) не нужно явно перехватывать, потому что они «не должны возникать». Когда они это делают, вам, конечно, нужно с ними где-то справиться.

регулярные исключения ДОЛЖНЫ быть перехвачены или объявлены как выброшенные, поскольку они представляют собой более сложный тип ошибки.

2 голосов
/ 14 марта 2011

Вам нужно прочитать о непроверенных исключениях - исключениях, которые наследуются от RuntimeException.Их не нужно объявлять в заголовке метода.

http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

Последний абзац подводит итог:

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

1 голос
/ 14 марта 2011

первая точка зрения при понимании исключений заключается в том, что они предназначены для исключительных ситуаций. Размышляя о вашем методе, вы должны спросить: «Должен ли этот метод генерировать исключение, если передано исключительное значение?» Если ответ «да», укажите его в объявлении метода. Я не знаю, поняла ли ты идею, но это довольно просто. Это просто вопрос практики.

1 голос
/ 14 марта 2011

IllegalArgumentException (наряду с некоторыми другими, например NullPointerException) являются примерами RuntimeException.Этот тип исключения не является так называемым проверенным исключением .Java требует, чтобы методы объявляли, какие проверяемые исключения они выдают, и что если вызываемый метод может генерировать проверенное исключение, вызывающий метод должен либо объявить, что он выдает само исключение, либо перехватить и обработать его.моя конкретная рекомендация была бы нет, не объявляйте это.Конечно, однако, вы не хотите ловить это.В большинстве случаев вы также не хотите бросать его , если это неожиданное поведение.Если для метода вполне нормально и разумно получать значение, которое ему не нравится, исключение - неправильный способ его обработки.

Возможно, вы также захотите рассмотреть использование утверждений.

...