Вопрос

При выполнении нулевых чеков в 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".

  • Потому что сообщение сообщает о состоянии, когда исключение было брошено.
  • Потому что это обычное, чтобы сделать это таким образом.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top