2011-06-21 55 views
-1

这是一个简单的代码片段,我不知道为什么它会抛出一个NullPointerExceptionNullPointerException,逻辑快捷方式

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 ..)

+3

如果您向我们展示堆栈跟踪将会很有帮助。 – someguy

+1

您可以标记NPE被抛出的行(在堆栈轨迹中可见)。 – Lutz

+0

好的,你是否都问过。 – jabal

回答

0

您确定me本身实际上不是null吗?

+0

是的,我甚至将代码调试到'me.getGroup()'方法调用 – jabal

+1

@jabal,如果我是你,我会给if子句添加额外的条件来检查我是否为null。 –

0

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

0

如果me不为空,那么上面唯一的其他对象可以为null片段是menuTevekenysegekGrouped。在首先使用它之前添加一个检查来确保它不为空。

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,但它可能使调试变得更加容易,而且更易于阅读。