神秘的NullPointerException

时间:2013-09-24 08:29:05

标签: java exception jpa if-statement nullpointerexception

我有以下代码。它工作正常。没有异常等。我循环遍历使用标准查询检索的JPA Entity对象列表(因此列表中没有任何null个对象)。

for (PeriodicalTable periodical : resultsP){
        stringFor.add(periodical.getReference());
        site = em.find(SiteTable.class, periodical.getSiteID());
        if (site != null && site.getPostcode() != null && !site.getPostcode().equals("")){
            tempString = site.getPostcode().replaceAll("\\s+", " ");
            periodical.setPostcode(tempString.trim());                       
            }    
        }

现在,我已添加if语句,以便只有在循环列表中的对象具有contractManagerID 0时才会触发一行。标记如下;

for (PeriodicalTable periodical : resultsP){
        if(periodical.getContractManagerID()==0) //<---- HERE!!!!
        {
            stringFor.add(periodical.getReference());
        }
        site = em.find(SiteTable.class, periodical.getSiteID());           
        if (site != null && site.getPostcode() != null && !site.getPostcode().equals("")){
            tempString = site.getPostcode().replaceAll("\\s+", " ");
            periodical.setPostcode(tempString.trim());                       
            }                
        }

经过一些调试后,我将异常隔离为来自if语句本身(标记为“HERE”),但我不明白这是怎么回事。我们知道列表中没有null个对象,否则即使没有if语句它也不会工作,但没有它就可以正常工作。我完全迷失了。

2 个答案:

答案 0 :(得分:4)

此处仅 的可能性是periodical.getContractManagerID()正在返回null

比较null == 0将为您提供NullPointerException

请改为:

if (periodical.getContractManagerID() == null || 
    periodical.getContractManagerID() == 0)

答案 1 :(得分:1)

有一种相当简单的方法可以找到它:

  • HERE 行中设置断点。当Eclipse(我假设您使用Eclipse)调试器弹出时,选择periodical变量并按Ctrl + Shift + I(这称为“Inspect”)。如果它不为null,则评估periodical.getContractManagerID()。它应该是null

这意味着您没有使用基元来存储该数字。您应该使用基元,添加合理的默认值或检查null

如果Integer课程中有PeriodicalTable,则表示null可以{{1}}。