Java: Как эффективно проверить наличие нулевых указателей - PullRequest
23 голосов
/ 25 января 2011

Существует несколько шаблонов для проверки, было ли параметру для метода присвоено значение null.

Во-первых, классический. Это часто встречается в самодельном коде и понятно для понимания.

public void method1(String arg) {
  if (arg == null) {
    throw new NullPointerException("arg");
  }
}

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

public void method2(String arg) {
  Assert.notNull(arg, "arg");
}

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

public void method3(String arg) {
  arg.getClass();
}

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

Какой чек вы предпочитаете и почему?

Ответы [ 14 ]

0 голосов
/ 25 января 2011

За него не проголосовали, но я использую небольшое изменение # 2, например

erStr += nullCheck (varName, String errMsg); // returns formatted error message

Обоснование: (1) я могу перебрать кучу аргументов, (2) метод nullCheck спрятан в суперклассе и (3) в конце цикла,

if (erStr.length() > 0)
    // Send out complete error message to client
else
    // do stuff with variables

В методе суперкласса ваш # 3 выглядит хорошо, но я бы не бросил исключение (в чем смысл, кто-то должен с этим справиться, и как контейнер сервлетов, tomcat будет игнорировать его, так что он может также будь этим () С уважением, - М.С.

0 голосов
/ 25 января 2011

Я предпочитаю метод 4, 5 или 6, где # 4 применяется к общедоступным методам API и 5/6 для внутренних методов, хотя # 6 будет чаще применяться к общедоступным методам.

/**
 * Method 4.
 * @param arg A String that should have some method called upon it. Will be ignored if
 * null, empty or whitespace only.
 */
public void method4(String arg) {
   // commons stringutils
   if (StringUtils.isNotBlank(arg) {
       arg.trim();
   }
}

/**
 * Method 5.
 * @param arg A String that should have some method called upon it. Shouldn't be null.
 */
public void method5(String arg) {
   // Let NPE sort 'em out.
   arg.trim();
}

/**
 * Method 6.
 * @param arg A String that should have some method called upon it. Shouldn't be null.
 */
public void method5(String arg) {
   // use asserts, expect asserts to be enabled during dev-time, so that developers
   // that refuse to read the documentations get slapped on the wrist for still passing
   // null. Assert is a no-op if the -ae param is not passed to the jvm, so 0 overhead.

   assert arg != null : "Arg cannot be null"; // insert insult here.
   arg.trim();
}

Лучшее решение для обработки пустых значений - не использовать пустые значения. Оберните сторонние или библиотечные методы, которые могут возвращать пустые значения с нулевыми ограничителями, заменяя значение чем-то, что имеет смысл (например, пустая строка), но ничего не делает при использовании. Бросьте NPE, если значение null действительно не должно быть передано, особенно в методах установки, где переданный объект не вызывается сразу.

0 голосов
/ 25 января 2011

Я бы использовал встроенный механизм Java assert.

assert arg != null;

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

0 голосов
/ 25 января 2011

Я считаю, что четвертый и самый полезный шаблон - ничего не делать. Ваш код создаст исключение NullPointerException или другое исключение через пару строк (если значение null является недопустимым) и будет нормально работать, если значение null в этом контексте нормально

Я считаю, что вы должны выполнять нулевую проверку, только если вы как-то с этим связаны. Проверка исключения исключения в большинстве случаев не имеет значения. Только не забудьте упомянуть в javadoc, может ли параметр быть нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...