NullPointerException, логический ярлык - PullRequest
0 голосов
/ 21 июня 2011

Вот простой фрагмент кода, и я не могу понять, почему он выбрасывает NullPointerException.

  String lastGroup = "";
  menuTevekenysegekGrouped = new ArrayList<MenuElem>();
  for(MenuElem me : menuA) {
    // double checked that me objects are never null
    // double checked that menuA is never null
    if(me.getGroup() != null && !me.getGroup().equals(lastGroup)) { /* NPE!!! */
        lastGroup = me.getGroup();
        MenuElem separ = new MenuElem();
        separ.setCaption(lastGroup);
        separ.setGroupHead(true);
        menuTevekenysegekGrouped.add(separ);
        menuTevekenysegekGrouped.add(me);
    } else {
        menuTevekenysegekGrouped.add(me);
    }
  }

В первой итерации me.getGroup() возвращает null. Таким образом, первый операнд && является ложным, а второй операнд не должен оцениваться в соответствии с JLS, насколько я знаю. Однако, когда я отлаживаю код, я получаю NPE из отмеченной строки. Я хотел бы знать почему. (Использование JRockit 1.6.0_05, если это имеет значение ..)

Ответы [ 4 ]

0 голосов
/ 21 июня 2011

Повторные вызовы me.getGroup() приведут меня к ошибке, чтобы вытащить их в локальную переменную:

  String lastGroup = "";
  for(MenuElem me : menuA) {
    String thisGroup = me.getGroup();
    if(thisGroup != null && !thisGroup.equals(lastGroup)) {
        lastGroup = thisGroup;
        MenuElem separ = new MenuElem();
        separ.setCaption(lastGroup);
        separ.setGroupHead(true);
        menuTevekenysegekGrouped.add(separ);
        menuTevekenysegekGrouped.add(me);
    } else {
        menuTevekenysegekGrouped.add(me);
    }
  }

Это только исправит вашу проблему, если на самом деле me.getGroup() возвращает разные значенияиногда null) для нескольких вызовов с одним и тем же me, но это может упростить отладку и, безусловно, облегчает чтение.

0 голосов
/ 21 июня 2011

Из вашего кода (без трассировки стека, я должен догадаться) следующее может быть нулевым и быть причиной: menuA или me или menuTevekenysegekGroupedИ некоторые из значений, возвращаемых из методов / или используемых в методах, также могут быть нулевыми, но это трудно понять ...

0 голосов
/ 21 июня 2011

Если me не равно нулю, то единственным другим объектом, который может быть нулевым в приведенном выше фрагменте, является menuTevekenysegekGrouped.Добавьте проверку перед первым использованием, чтобы убедиться, что она не равна нулю.

0 голосов
/ 21 июня 2011

Вы уверены, что me само по себе не является нулем?

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