NULL CHECK ОШИБКА СООБЩЕНИЯ AS "NULL" или "было null"
-
26-09-2019 - |
Вопрос
При выполнении нулевых чеков в Java Code, и вы бросаете RegalAlarGumentExceptions для нулевых значений, какой шаблон сообщения вы используете?
Мы склонны использовать что-то вроде этого
public User getUser(String username){
if (username == null){
throw new IllegalArgumentException("username is null");
}
// ...
}
Что лучше: «Нет нулевой» или «был нуль», а почему?
Для меня «нуль» чувствует себя более естественным.
Решение
Поскольку Exception
Обращается из-за неудачной проверки предварительного условия, я думаю, что скорее просто заявляя о факте, вы должны указать требование Это было нарушено.
То есть вместо того, чтобы сказать "username is null"
, сказать "username should not be null"
.
При использовании библиотек для проверки предварительного условия
В качестве кончика вы можете использовать одну из многих библиотек, предназначенных для облегчения проверки предварительного условия. Многие код в Guava использует com.google.common.base.Preconditions
Простые статические методы, которые нужно вызывать в начале ваших собственных методов для проверки правильных аргументов и состояния. Это позволяет конструировать, такие как
if (count <= 0) { throw new IllegalArgumentException("must be positive: " + count); }
быть замененным более компактным
checkArgument(count > 0, "must be positive: %s", count);
Более прямым релевантным вот в том, что он имеет checkNotNull
, что позволяет вам просто написать:
checkNotNull(username, "username should not be null");
Обратите внимание, как естественно вышеуказанный код читает, с подробным сообщением явно указывает требование Это было нарушено.
Альтернатива заявленных фактов более неловко:
// Awkward!
checkArgument(count > 0, "is negative or zero: %s", count);
checkNotNull(username, "username is null");
Более того, это также потенциально менее полезно, поскольку клиент может быть в курсе факта, и исключение не помогает им выяснить, какая фактическая требования находятся.
На IllegalArgumentException
против NullPointerException
В то время как ваш оригинальный код бросает IllegalArgumentException
на null
Аргументы, Гуава Preconditions.checkNotNull
бросать NullPointerException
вместо.
Это в соответствии с руководством, установленным API:
NullPointerException
: Приложения должны бросать экземпляры этого класса, чтобы указать другие незаконные примененияnull
объект.
Кроме того, вот цитата из Эффективное java 2nd издание: пункт 60: пользу использования стандартных исключений:
Возможно, все ошибочные вызовы метода сводки до нелегального аргумента или незаконного состояния, но другие исключения стандартно используются для определенные виды незаконных аргументов и государств. Если абонент проходит
null
В некоторых параметрах, для которых нулевые значения запрещены, Конвенция диктует, чтоNullPointerException
быть брошенным, а неIllegalArgumentException
.
Другие советы
нулевой, так как аргумент все еще нулевой ..
Тем не менее, почему бы не просто бросить NullPointerexception без сообщения?
Я бы предложил сказать
if (userName == null) {
throw new IllegalArgumentException("username == null");
}
Как это так смертельно, что программист должен смотреть на это в любом случае. Ссылаясь на оскорбительный фрагмент кода в сообщении исключения - самая неизвестная вещь, которую я могу себе представить.
Я был бы склонен написать это:
public User getUser(String username) {
if (username.length() == 0) {
throw new IllegalArgumentException("username is empty");
}
// ...
}
Это убивает двух птиц одним камнем. Во-первых, он обнаруживает случай, когда имя пользователя является пустой строкой, которая (ради аргумента) я предполагаю, что ошибка. Во-вторых, если параметр null
пытаясь отправить length
звонок даст NullPointerException
.
Для записи, ожидал Исключение для броска для неожиданного null
является NullPointerException
. Отказ Если ваша главная причина не использует именно то, что NPE обычно не имеет сообщения, код так:
public User getUser(String username){
if (username == null){
throw new NullPointerException("username is null");
}
if (username.length() == 0) {
throw new IllegalArgumentException("username is empty");
}
// ...
}
Зачем использовать NPE здесь? Потому что NPE почти всегда указывает разные виды проблемы к другим видам ошибки проверки аргумента; например, поле или ячейка массива, которая не была инициализирована или «необязательное» значение, которое не обрабатывается должным образом.
Наконец на вопрос:
Что лучше :
"is null"
или"was null"
, и почему?
Это вопрос мнения, но я бы написал "is null"
.
- Потому что сообщение сообщает о состоянии, когда исключение было брошено.
- Потому что это обычное, чтобы сделать это таким образом.