InvalidParameterException или IllegalArgumentException

В Java, когда вы должны бросать IllegalArgumentException и когда InvalidParameterException? Исходя из фона С#, мы бы получили ArgumentNullException, полученный из ArgumentException. Если бы я хотел бы реализовать эквивалент ArgumentNullException/ParameterNullException в Java, я должен расширить IllegalArgumentException или InvalidParameterException?

Примечание. Я не пытаюсь реализовать ArgumentNullException/ParameterNullException, это просто обеспечит мне лучшее понимание, если я смогу сопоставить их с каркасом С#.

Ответы

Ответ 1

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

java.security.InvalidParameterException уже является подклассом IllegalArgumentException, предназначенным для использования ядрами JCA/JCE (JavaDoc), и я не буду использовать или подклассифицировать его в другом контексте.

Ответ 2

Первое спасибо за ваш вопрос. Теперь я знаю о существовании InvalidParameterException. Это исключение относится к пакету java.security и в соответствии с его javadoc

 * This exception, designed for use by the JCA/JCE engine classes, 
 * is thrown when an invalid parameter is passed 
 * to a method.

IllegalArgumentExcption принадлежит java.lang и поэтому может использоваться для любых целей.

Я считаю, что в 99,9% случаев вы должны использовать IllegalArgumentExcption и использовать InvalidParameterException только в контексте безопасности.

Ответ 3

Уже существует исключение, когда вы ожидаете, что параметры не будут равны null: NullPointerException. Некоторые программисты думают, что только ошибочный код бросает NullPointerException, но если вы действительно ожидаете, что параметры не будут равны нулю, и вы не сможете оправиться от этой ситуации, это правильное исключение для броска. Из JavaDoc:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект.

Но если мы говорим не о нулевых значениях, а просто о недопустимом значении, вы должны выбросить IllegalArgumentException. Из JavaDoc:

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

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

Также обратите внимание, что исключение "InvalidParameterException" находится в пакете "java.security", что, вероятно, не является тем, что вы хотите.