2009-05-05 1 views
51

Например, многие методы в рамках/JDK может броситьДолжны ли методы, которые бросают RuntimeException, указывают на подпись метода?

java.lang.SecurityException 

, но это не указано в подписи метода (так как это практика, как правило, зарезервированы для проверяемых исключений). Я хочу утверждать, что объявление RuntimeExceptions в методе sigs имеет много преимуществ (например, для проверки статического типа). Я пьян или иначе?

ответ

42

Я не объявлял бы неконтролируемое исключение в подписи, поскольку оно вводит в заблуждение пользователя этого API. Уже не очевидно, должно ли исключение быть явно обработано.

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

+1

Компилятор java не заставляет вас обрабатывать объявленные RuntimeExceptions. Поэтому вы можете объявить их с целью как «намек» для разработчиков. Это обсуждается, если JavaDoc лучше для этого. Пункт об отмеченных и непроверенных исключениях. Проверено и не отмечено. Исключения - это то, что на самом деле означает Java (с исключениями Compiletime-) (проверено) и RuntimeExceptions (unchecked). – Guardian667

+2

Весной объявление об исключении исключений в сигнатуре метода стало обычной практикой. – danidacar

4

С моей точки зрения, лучше объявить исключения во время выполнения, по крайней мере, в javadoc для метода. Объявление в подписи делает еще более очевидным, что может произойти, когда что-то пойдет не так. Это моя основная причина предлагать эту информацию.

FYI: по прошествии времени (сейчас в 2017 году) я склоняюсь теперь гораздо больше, чтобы документировать их только в javadoc и избегать проверенных исключений как можно больше.

1

Это связано с обсуждением относительно checked exceptions. Большинство согласится с тем, что исключения не должны быть объявлены в методах подписи.

Существует также discussion относительно того, как следует использовать исключения времени выполнения. Я согласен с одним плакатом, что исключения во время выполнения должны означать ошибку программирования или фатальное состояние. Таким образом, в подписи нет большого достоинства, объявляющего их. Каждый метод может потенциально через один.

+0

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

+1

Я хочу сказать, что разработчик не должен заставлять проверять исключения. Поэтому нет необходимости объявлять их в сигнатуре метода. В Java вы можете преобразовать их во время выполнения исключений, как это делает Spring. Я также говорю, что исключения времени выполнения должны быть выбрасываться только в ситуациях, которые не могут быть восстановлены. – kgiannakakis

3

По моему мнению, исключенные исключения не должны быть объявлены в сигнатуре метода, поскольку это противоречит их природе.

Если, однако, метод может вызвать некоторые непроверенные исключения, учитывая, что вероятные обстоятельства в @throws в Javadoc могут быть полезны для других, которые ссылаются на метод, понимая, что может пойти не так. Это полезно только, хотя исключения, что абоненты, вероятно, будет в состоянии обрабатывать (например, NPE из-за плохой вход и т.д.)

15

Взгляните на Javadoc для сбора # добавить

Там целый убивание непроверенных исключений упоминается:

Throws: 
UnsupportedOperationException - add is not supported by this collection. 
ClassCastException - class of the specified element prevents it from being added to this collection. 
NullPointerException - if the specified element is null and this collection does not support null elements. 
IllegalArgumentException - some aspect of this element prevents it from being added to this collection. 

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

+1

Этот ответ неверен. Вы говорите о высказываниях Javadoc, а вопрос о 'throws' в сигнатуре метода. Это не одно и то же. Да, вы абсолютно * должны * документировать все исключения, брошенные вашим API, но вопрос не в этом. – Gili

3

Если вы пишете api для использования другими, то есть достаточная причина для явной документации о вашем намерении в api, и нет недостатка в объявлении RuntimeExceptions в сигнатуре метода.

21

От the Oracle Java tutorial:

«Если это так хорошо, чтобы документировать API-методов, в том числе исключения он может бросить, то почему бы не указать исключения во время выполнения тоже?» Runtime исключений представляют проблемы, являющиеся результатом проблемы программирования , и, как следствие, код клиента API не может быть ожидаемым, чтобы восстановить их или обработать их каким-либо образом. Такие проблемы включают в себя арифметические исключения, такие как деление на ноль; исключения указателя, например, попытки доступа к объекту через нулевую ссылку ; и исключения индексирования, такие как попытка доступа к элементу массива через слишком большой или слишком большой индекс.

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

+0

Таким образом, компилятор не требует, чтобы вы улавливали или указывали исключения выполнения (хотя вы можете). – danidacar