Сообщение об ошибке проверки нуля как "является нулевым" или "было нулевым" - PullRequest
11 голосов
/ 11 июня 2010

При выполнении нулевых проверок в коде Java, когда вы генерируете IllegalArgumentExceptions для нулевых значений, какой тип сообщения вы используете?

Мы склонны использовать что-то вроде этого

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

Что лучше: "равно нулю" или "было равно нулю" и почему?

Для меня «ноль» кажется более естественным.

Ответы [ 4 ]

15 голосов
/ 11 июня 2010

Поскольку Exception выбрасывается из-за неудачной проверки предварительных условий, я думаю, что вместо того, чтобы просто констатировать факт, следует указать требование , которое было нарушено.

То есть вместо того, чтобы сказать "username is null", скажем "username should not be null".


Об использовании библиотек для проверки предварительных условий

В качестве подсказки вы можете использовать одну из множества библиотек, разработанных для облегчения проверки предварительных условий. Многие код в Гуаве использует 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 в Guava вместо этого NullPointerException.

Это соответствует директиве, установленной API:

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

Кроме того, вот цитата из Effective Java 2nd Edition: Item 60: Поддержите использование стандартных исключений :

Возможно, все ошибочные вызовы методов сводятся к недопустимому аргументу или недопустимому состоянию, но другие исключения стандартно используются для определенных видов недопустимых аргументов и состояний. Если вызывающая сторона передает null в каком-либо параметре, для которого нулевые значения запрещены, соглашение предписывает выбрасывать NullPointerException вместо IllegalArgumentException.

5 голосов
/ 11 июня 2010

равно нулю , поскольку аргумент по-прежнему равен нулю ..

Однако, почему бы просто не выбросить исключение NullPointerException без сообщения?

0 голосов
/ 11 июня 2010

Я был бы склонен написать это:

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".

  • Поскольку в сообщении сообщается о состоянии, когда было сгенерировано исключение.
  • Потому что так обычно делают.
0 голосов
/ 11 июня 2010

Я бы предложил сказать

  if (userName == null) {
     throw new IllegalArgumentException("username == null");
   }

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

...