检查Integer值是否为null时发生Java异常

时间:2014-02-20 15:00:07

标签: java null nullpointerexception integer

以下代码片段导致我的程序抛出一个空指针异常,我正在努力确定原因:

private void ...(){
    HierarchyForm hForm = (HierarchyForm)
    Integer id = hForm.getId();
    if (id != null && id.intValue() > 0){ <-- exception thrown here
        ...
    }
    .
    .
    .
}

当它崩溃时,“id”的值为null。我知道这可能很简单,但我不明白为什么。

编辑:这是一个简短的程序,显示它失败了。似乎是.intValue比较http://ideone.com/e.js/H0Mjaf

的问题

编辑:我正在为java 1.6.0_45构建

4 个答案:

答案 0 :(得分:0)

如果id为null,则该行不应该抛出NPE。

如果&amp;&amp;的第一个操作数如果为false,则不评估第二个操作数,结果只是false。

请再次检查您的代码并确保在评估id.intValue()时您正在获取NPE。

答案 1 :(得分:0)

使用此格式并找到正确的解决方案:

String id = request.getParameter("id");

        if(id!=null && !id.toString().equalsIgnoreCase(""))
        {
            user.setId(Integer.parseInt(id));
            dao.updateUser(user);
        }
        else
        {
            dao.addUser(user);
        }

如果使用其他类型的格式:

String id = request.getParameter("id");

        if(id == null || id.isEmpty())
        {
            dao.addUser(user);
        }
        else
        {
            user.setId(Integer.parseInt(id));
            dao.updateUser(user);
        }

很简单,把空检查!用if语句覆盖你的对象

Object mayBeNullObj = getTheObjectItMayReturnNull();

if (mayBeNullObj != null) 
   { 
     mayBeNullObj.workOnIt(); // to avoid NullPointerException
   }

但是,所有人都给出了同样的结果。

答案 2 :(得分:0)

此行导致NPE的唯一方法是在id.intValue()元素上执行null

如果id.intValue()为false,Java将不会执行id != null,因为&&正在缩短执行时间。

我怀疑你的代码实际上是这样的:

if (id != null & id.intValue() > 0) {

虽然看起来像这样:

if (id != null && id.intValue() > 0) {

答案 3 :(得分:-3)

你需要这样写:

private void ...(){
  HierarchyForm hForm = (HierarchyForm)
  Integer id = hForm.getId();
  if (id != null)
     if (id.intValue() > 0){ <-- exception thrown here
     ...
     }
  }
  . 
  .
  .
}

编辑: Certo,eunãohaviacomtemplado que o“&amp;&amp;”没有java tinha este comportamento de resolver a primeiraclassoesóresolvera segunda em caso“true”。

Neste caso,claro,estou de concordo com as respostas dos colegas e respectrandoquevocêtenhapostadoocódigoricatamente,meupalpiteéquetenha algo a ver com acesso concorrente ao mesmo objeto hForm,algummétodopodeestar atribuindo“null” para o hForm ou ao id。

Espero ter ajudado desta vez。

好的,我没想过“&amp;&amp;”在java中有这种行为来解决第一个表达式而第二个只解决了“true”。

在这种情况下,当然,我同意同事的回答,并假设您已正确发布代码,我的猜测是否与同一对象的并发访问有关hForm,某些方法可能为hForm或id分配“null”。

这次我帮了忙。