NullPointerException,逻辑快捷方式

时间:2011-06-21 11:07:47

标签: java nullpointerexception

这是一个简单的代码段,我无法弄清楚它为什么抛出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。因此,据我所知,&&的第一个操作数为false,第二个操作数不应根据JLS进行求值。但是,当我调试代码时,我从标记的行中获取NPE。我想知道为什么。 (如果重要的话,使用JRockit 1.6.0_05。)

4 个答案:

答案 0 :(得分:0)

你确定me本身不是空的吗?

答案 1 :(得分:0)

从您的代码(没有我必须猜测的堆栈跟踪),以下内容可能为空并且是原因:menuAmemenuTevekenysegekGrouped。从方法返回或在方法中使用的一些值也可能为空,但很难知道......

答案 2 :(得分:0)

如果me不为null,则上述代码段中唯一可以为null的其他对象为menuTevekenysegekGrouped。在首次使用之前添加一个检查,以确保它不为空。

答案 3 :(得分:0)

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()在具有相同me的多个调用中返回不同的值(有时为null),这只会解决您的问题,但它可能会使调试更容易,当然也会使它更容易阅读。