这是一个简单的代码段,我无法弄清楚它为什么抛出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。)
答案 0 :(得分:0)
你确定me
本身不是空的吗?
答案 1 :(得分:0)
从您的代码(没有我必须猜测的堆栈跟踪),以下内容可能为空并且是原因:menuA
或me
或menuTevekenysegekGrouped
。从方法返回或在方法中使用的一些值也可能为空,但很难知道......
答案 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),这只会解决您的问题,但它可能会使调试更容易,当然也会使它更容易阅读。