Как исправить проблему FindBugs «Нулевое значение гарантированно будет остановлено» NP_GUARANTED_DEREF

StackOverflow https://stackoverflow.com/questions/5329036

Вопрос

Привет, у меня есть какой -то код, который, как сообщается, имел проблему NP_GUARANTED_DEREF от FindBugs. Теперь, глядя на свой код, я не совсем понимаю, что с ним не так, может кто -нибудь предложить, в чем проблема.

public void test() {
  String var = "";
  int index = 2;
  if (index == -1) {
    var = String.class.getName();
    if (var.length() == 0) {
      var = null;
    }
  } else {
    var = Integer.class.getName();
    if (var.length() == 0) {
      var = null;
    }
  }
  if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF
    /*
     * There is a statement or branch that if executed guarantees that a value
     * is null at this point, and that value that is guaranteed to be
     * dereferenced (except on forward paths involving runtime exceptions).
     */
    throw new NullPointerException("NULL");
  }
}

Теперь бурение в ошибке в Findbugs. Он подчеркивает два назначения var = null; Как причина ошибки, но я не совсем понимаю, почему. Это не так, как будто я на самом деле что -то делаю с var Объект, я просто делаю нулевую проверку. Пример взят из реального производственного кода, но лишит всего, что не нужно для воспроизведения ошибки. Что мне интересно, является ли это ложным позитивным или нет. А если бы не то, что было бы подходящим исправлением.

Вот ссылка на детали ошибки FindBugs: http://findbugs.sourceforge.net/bugdescriptions.html#np_guarantied_deref

Обновление] После получения некоторых отзывов по этому вопросу я теперь зарегистрировал это как ложно -позитивный в ошибке FindBugs в SourceForge. https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

Разговор о проблеме будет продолжаться.

Это было полезно?

Решение

Я понимаю. Я могу подтвердить то же поведение FB на моем компьютере. Действительно выглядит странно. Что смешно, что если ты заменил throw new NullPointerException с throw new RuntimeException Маркер ошибки исчезнет.

Теперь я думаю, что понимаю, что они имели в виду. Формулировка сообщения не является точной, но они предупреждают вас от NPE. Я предполагаю, что они считают явным выбросом NPE плохой практикой.

Другие советы

Это ошибка в Findbugs, опубликуйте этот вопрос на своей странице трекера. findbugs.sf.net

ОК, то, что ищет Findbugs, является заявлением или филиалом, которое гарантированно приведет к исключению нулевого указателя. Первоначально мы искали только выделения нулевых значений. Позже мы дополнили анализ для лечения

if (x == null) throw new NullPointerException()

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

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

Я не совсем уверен, какова цель вышеуказанного кода. В точках, где вы назначаете NULL VAR, вы создаете ситуацию, которая приведет к явному броску исключения нулевого указателя вниз. Это действительно то поведение, которое вы хотите?

Присмотреть ближе к определению сообщения об ошибке здесь, это говорит:

Существует заявление или филиал, что в случае выполнения гарантии того, что значение является нулевым на данный момент, и это значение, которое гарантированно будет остановлено (за исключением прямого пути, связанных с исключениями во время выполнения)

Это заставляет меня думать, что это либо просто позволить вам знать, что VAR будет нулевым, либо что -то на самом деле заставляет Findbugs думать, что VAR ссылается на оператор IF.

Код, который вы разместили, выглядит нормально, я бы дважды проверил, что VAR не доступен в истинном коде.

Единственное, что я могу изменить, - это написать сравнение назад, как так:

if (null == var)

Таким образом, это очевидно, если вы оставите одну из =S/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top